in reply to Extraneous behaviour of match variables
But the second 'if' reset the match variables in a failed test.
Are you talking about the blank output for "N"? "N" is reached on a successful match. It's printing blank because $1 was cleared because /video/ has no captures.
if ( $1 !~ /video/ )
simply means
if ( !( $1 =~ /video/ ) )
The negation occurs *after* the match fails or succeeds.
Update: Maybe the following will make things a little clearer:
for (qw( video book )) { 'unchanged' =~ /(.*)/; # Set $1 if ( $_ !~ /(video)/ ) { print "true -> $1\n"; } else { print "false -> $1\n"; } }
false -> video true -> unchanged
When the match succeeds and the expression returns false, $1 is set.
When the match fails and the expression returns true, $1 remains unchanged.
Update: And finally, a solution to your problem
foreach my $link ( '<a href="/story/43480/">The Bottled Water Lie</a>', '<a href="/story/video/43480/">The Bottled Water Lie</a>', ) { my ($url, $title) = $link =~ m{href="(.+)">(.+)</a>} or next; $url =~ /video/ and next; print("$url: $title\n"); }
or
foreach my $link ( '<a href="/story/43480/">The Bottled Water Lie</a>', '<a href="/story/video/43480/">The Bottled Water Lie</a>', ) { my ($url, $title) = $link =~ m{href="((?:(?!video).)+)">(.+)</a>} or next; print("$url: $title\n"); }
Replace the print with whatever you want.
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: Extraneous behaviour of match variables
by explorer (Chaplain) on Nov 03, 2006 at 13:34 UTC | |
by Fletch (Bishop) on Nov 03, 2006 at 14:30 UTC | |
by ikegami (Patriarch) on Nov 03, 2006 at 15:41 UTC |