in reply to if ($2) behaves differently than if (defined $2)

Aside from your defined issue, it is also a good idea to keep in mind that $1, $2, etc., retain their values from earlier successful pattern matches. Obviously, with your small example, you are only attempting one match. But, with code that attempts several matches, there will be problems unless all match attempts are checked.

Here is an example to illustrate the point:

#!/usr/bin/env perl use warnings; use strict; my $str; $str = 'abc def 12'; $str =~ /(\d+)/; print "$1\n" if ($1); $str = 'foo'; $str =~ /(\d+)/; print "$1\n" if ($1); if ($str =~ /(\d+)/) { print "$1\n"; } else { print "no match\n"; }

prints:

12 12 no match

The 2nd "12" is unexpected since the string 'foo' contains no digits.