On Fri, Mar 14, 2014 at 4:26 AM, Alex Chiang
<s3442...@student.rmit.edu.au> wrote:

> I tried to extract string from perl script, so I wrote following script:
>
>   5# matching string
>   6 # sting start with ' or ".
>   7 # assume string is on same line.
>   8 #
>   9 my $pattern = '(\"|\').*\1';
>  10 my @array;
>  11 open (my $file, "<", "str");
>  12 while (my $line = <$file>) {.
>  13     if($line =~ /$pattern/) {
>  14         push (@array, $&);
>  15     }
>  16 }
>  17
>  18 for (@array) { print "$_\n"; }
>
>
> the str sample file :
> -----------------------------------------------
> 'okay i know now'
> "from time to time" 'let us go'
> this is awkward
> ------------------------------------------------
>
> I would expect the output match three of them, however, it only matches:
> ------------------------------
> 'okay i know now'
> "from time to time"
> -------------------------------
> leaving 'let us go' unmatched.
>
> I don't know how to describe this problem, Can anyone help me with this ?
>

Here's a safer, more efficient version:
see: perldoc perlre

* uses 'qr' for reg.exp. compilation
* avoid speed penalty of $& with /p switch
* \g{} captures instead of \1 which can  be      ambiguous in case of \10 eg.

my $pattern = qr/("|').*?\g{1}/;
my @array;
while (my $line = <$file>){
   while($line =~ /$pattern/pg) {
      push (@array, ${^MATCH});
   }
}

-- 
Charles DeRykus

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