in reply to How do I delete from a delimiter to the end of a file?

$file =~ s/------ Yahoo.*?(?=\cB)//sg;

Update: Added "s" modifier.

Replies are listed 'Best First'.
Re^2: How do I delete from a delimiter to the end of a file?
by JavaFan (Canon) on Aug 25, 2008 at 12:51 UTC
    .*? usually comes with a speed penalty (unless the optimizer eliminates running .*? at all), as Perl needs to do bookkeeping for possible backtracking.

    I'd write it as:

    s/------ Yahoo[^\cb]*+//g; # Keeps the ^B s/------ Yahoo[^\cb]*+\cB//; # Removes the ^B as well.

      I don't know from where you got your information, but it appears to be incorrect.

      Rate JavaFan JavaFan_noplus ikegami JavaFan 104/s -- -5% -16% JavaFan_noplus 109/s 5% -- -12% ikegami 123/s 19% 13% -- Rate JavaFan JavaFan_noplus ikegami JavaFan 109/s -- -2% -11% JavaFan_noplus 110/s 2% -- -10% ikegami 122/s 13% 11% -- Rate JavaFan JavaFan_noplus ikegami JavaFan 103/s -- -5% -21% JavaFan_noplus 109/s 5% -- -17% ikegami 131/s 27% 20% --
        That surprises me, and I wonder why .*? is somewhat faster than a more explicite pattern.

        However, I'd still shy away from using .*?. Consider the effect of a slight change of the string we are matching against (basically, replacing the \cB with \cA):

        use Benchmark qw( cmpthese ); my $ad = <<'__EOI__'; ------ Yahoo meow meow meow meow meow meow meow meow woof woof woof woof jabberwocky foo bar! foo!! __EOI__ my $email = join '', map chr(rand(26)+ord('a')), 1..2000; our $file = "$email\n$ad\cA" x 1000; cmpthese(-3, { ikegami => 'use strict; use warnings; my $x = our $file; $x +=~ s/----- - Yahoo.*?(?=\cB)//sg;', JavaFan => 'use strict; use warnings; my $x = our $file; $x +=~ s/----- - Yahoo[^\cB]*+//g;', JavaFan_noplus => 'use strict; use warnings; my $x = our $file; $x +=~ s/----- - Yahoo[^\cB]*//g;', }); __END__ (warning: too few iterations for a reliable count) Rate ikegami JavaFan JavaFan_noplus ikegami 0.264/s -- -98% -98% JavaFan 16.2/s 6053% -- -1% JavaFan_noplus 16.5/s 6135% 1% --