2009/12/22 Parag Kalra <paragka...@gmail.com>:
> You can try following:
>
> $_ =~ s/^\.(\s)+//g;

This isn't quite right.

There are two ways in which you might use this substitution: either $_
will contain a single line, or it will contain multiple lines. The
single line case might look something like this:

while (<>) {
    s/^\.(\s)+//g;
    print;
}

In this case, however, the /g modifier is redundant and confusing,
since you only want the regex to match once at the start of each line.
Take the /g modifier off.

The multiple line case might look like this:

$_ = do {local $/; <>;}; # but better to use File::Slurp
s/^\.(\s)+//g;
print;

This code is broken. The problem is that ^ matches start-of-string,
not start-of-line. Therefore, even with the /g modifier the regex can
only match at the beginning of the string, and so will only match
once.

To change ^ to match start-of-line, you need the /m modifier:

s/^\.(\s)+//gm;
print;

Perl Best Practices makes the interesting recommendation that all
regexes should use the /m modifier, because having ^$ match line
boundaries seems to be what most programmers expect and seems to be
useful much more often. If you still need to match start and end of
string you can use \A and \z.

Phil

-- 
To unsubscribe, e-mail: beginners-unsubscr...@perl.org
For additional commands, e-mail: beginners-h...@perl.org
http://learn.perl.org/


Reply via email to