in reply to What is this erroring out?
Your second match overwrites the captured values from the first match. If you want to keep the values, you need to copy them. Also, you should always check whether your match succeeds before operating on values:
sub test { my $a = shift; die "Malformed value '$a'" if ($a !~ /(.)(.)(.)(..)(.+)/); my ($first,$second,$third,$fourth) = ($1,$2,$3,$4); return 0 if ($first !~ /(a)/); return 0 if ($second !~ /(d|p|t)/); return 0 if ($third !~ /(a|h|r|s|t)/); return 0 if ($fourth !~ /(aw|er|dd|cb|aa)/); }
Alternatively, you could mush the five regular expressions into one:
sub test { my $a = shift; $a =~ /(a)(d|p|t)(a|h|r|s|t)(aw|er|dd|cb|aa)(.+)/; }
You could optimize the regex further by using character classes, that is, writing [dpt] instead of d|p|t.
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: What is this erroring out?
by yoda54 (Monk) on Mar 16, 2010 at 08:05 UTC |