Ok, I understand perl hash slices, and the “x” operator in Perl, but can someone explain the following code example from here (slightly simplified)?
sub test{
my %hash;
@hash{@_} = (undef) x @_;
}
Example Call to sub:
test('one', 'two', 'three');
This line is what throws me:
@hash{@_} = (undef) x @_;
It is creating a hash where the keys are the parameters to the sub and initializing to undef, so:
%hash:
‘one’ => undef,
‘two’ => undef,
‘three’ => undef
The rvalue of the x operator should be a number; how is it that @_ is interpreted as the length of the sub’s parameter array? I would expect you’d at least have to do this:
@hash{@_} = (undef) x scalar @_;
To figure out this code you need to understand three things:
The repetition operator. The
xoperator is the repetition operator. In list context, if the operator’s left-hand argument is enclosed in parentheses, it will repeat the items in a list:Arrays in scalar context. When an array is used in scalar context, it returns its size. The
xoperator imposes scalar context on its right-hand argument.Hash slices. The hash slice syntax provides a way to access multiple hash items at once. A hash slice can retrieve hash values, or it can be assigned to. In the case at hand, we are assigning to a hash slice.
Less obscure ways to do the same thing: