michi: Text-Datei erzeugen

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/";
}

  1. 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

    --
    »Sie kochten heimlich mit Wasser und tranken öffentlich Wein.«
    1. Hallo Siechfred!
      Dankeschön für die Erklärung!!
      MfG
      michi