Text-Datei erzeugen
michi
- perl
Hallo,
also ich habe absolut keinen Plan von Perl: wie kann man eine Text-Datei erzeugen anstatt das ergebnis direkt auf dem bildschirm auszugeben? danke!
mfg
michi
#!C:\a\Perl\bin\perl.exe
use Regexp::Optimizer;
open(ADBLOCK, "adblock.txt") || die "No adblock.txt file found!";
while (my $line = <ADBLOCK>) {
next if ($line =~ /^[Adblock]$/);
my $phrase = $line;
$phrase =~ s/\s//g;
if ($phrase =~ m|^/.+/$|) { push(@filters, $phrase); next; } # RegEx: don't optimize
$phrase =~ s/^\|\$//g; # Remove useless globs on begin/end
if ($phrase =~ m|http://([^/]+)/?$|) { # Full domain blocking
$phrase = $1;
$phrase =~ s/^\|\$//g;
push(@domains, $phrase);
}
elsif ($phrase =~ m|http://([^/]+)/(.+)|) { # Directory domain blocking
my ($domain, $dir) = ($1, $2);
$domain =~ s/^\*//g;
$dir_domains{$domain} .= "$domain/$dir\0";
}
elsif ($phrase =~ m|^/.+/$|) { # Global directory blocking
push(@dir, $phrase);
}
else { # Word/phrase/something else
push(@misc, $phrase);
}
}
close(ADBLOCK);
push(@filters, &ad_optimize(@dir));
push(@filters, &ad_optimize(@domains));
push(@filters, &ad_optimize(@misc));
foreach my $domain (sort keys %dir_domains) { push(@filters, &ad_optimize(split(/\0/, $dir_domains{$domain}))); }
print "[Adblock]\n";
foreach my $regexp (@filters) { print "$regexp\n"; }
exit;
sub ad_optimize {
my @list = sort @_;
return @list if (@list < 2);
my $total_chars;
foreach my $phrase (@list) {
$total_chars += length($phrase);
$phrase =~ s/([^\w/-])/\$1/g;
$phrase =~ s/\\*/.*/g;
}
my $o = Regexp::Optimizer->new(modifiers => 'i');
my $re = $o->list2re(@list);
$re =~ s/^\Q(?-xism:(?i:\E(.+)))$/$1/;
$re =~ s/(?:/(/g;
if (length($re) > ($total_chars + 10) || length($re) > 255) { # Split the list and try again
@list = sort @_;
my @list_a = splice(@list, 0, int(@list / 2));
return (&ad_optimize(@list_a), &ad_optimize(@list));
}
return "/$re/";
}
Tag michi.
also ich habe absolut keinen Plan von Perl: wie kann man eine Text-Datei erzeugen anstatt das ergebnis direkt auf dem bildschirm auszugeben? danke!
Jesses, eine Unmenge an Quellcode, das ist ja schon fast Quälcode :)
Aber ich nehme an, dass dir das hier:
print "[Adblock]\n";
foreach my $regexp (@filters) { print "$regexp\n"; }
Sorgen bereitet, dabei ist es relativ einfach:
also z.B. so:
open(DATEI, ">textdatei.txt") || die $!;
print DATEI "[Adblock]\n";
foreach my $regexp (@filters) { print DATEI "$regexp\n"; }
close(DATEI);
Übrigens, vergiss das Flocken nicht, use Fcntl ':flock' sollte dabei helfen.
[dsf 3.6]
Siechfred
Hallo Siechfred!
Dankeschön für die Erklärung!!
MfG
michi