Rob Dixon wrote:
Nigel Peck wrote:
>
> Hi all,
>
> I'm trying to get the following to work and can't. It's the assignment
> to $val1 and $val2 that's causing me the problem.
>
> my ( $val1, $val2 ) = $data =~ /^([^:]+):([^:]+)$/
> || die 'Failed to parse data';
>
> What am I doing wrong? I can do it on multiple lines by assigning $1 and
> $2 to the variables after the regex but I want to do it all on one line.
Hi Nigel
The || operator has a higher priority than assignment, so you've written:
my ($val1, $val2) = ($data =~ /^([^:]+):([^:]+)$/ || die 'Failed to
parse data');
This forces the regex match into scalar context, so it returns 1 if it
succeeds,
which leaves $val1 equal to 1 and $val2 undefined.
Instead, use the low-precedence 'or' operator:
my ($val1, $val2) = $data =~ /^([^:]+):([^:]+)$/ or die 'Failed to parse
data';
and all will be well.
By the way, also consider:
my @data = $data =~ /[^:]+/g;
die unless @data == 2;
my ($val1, $val2) = @data;
or similar.
Rob
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>