That’s because two pairs of square brackets were lost due to the absence of <code> tags. I believe the two statements within the loop were originally as follows:
@$_ = split /(?:,|\s)+/, $row;
$#$_ != 2 ? next : push @{$data{$_->[2]}}, @$_[1, 0];
The first line treats $_ as an array reference and autovivifies the array @$_, populating it with the comma-and-whitespace-separated fields in $row. In the second line, $#$_ is the index of the last element in @$_, so if it is not 2 (corresponding to 3 fields) then this data line is skipped. If exactly 3 fields were extracted from $row into @$_, the second and first fields, in that order, are pushed onto the anonymous array $data{$_->[2]}, where $_->[2] is the name field. So after running the loop with the data given, the hash %data (formatted by Data::Dump) looks like this:
{ bill => [1427766556, 5], bob => [1427766557, 12, 1427766555, 10] }
To the OP: What makes this code look strange — apart from the missing square brackets — is:
- the unusual use of $_: normally we would expect to see it used as the loop variable; and
- the use of the conditional (ternary) operator ?: for flow control: it is considered better practice to restrict the use of this operator to data selection.
Hope that helps,
|