一次分配多个键/值对

时间:2015-06-01 21:00:58

标签: perl

是否有可能将此分配作为某种类型的数组赋值,因此它不是那么冗长?

    $byRobotNumber->{'inquiry'} = $tokens->[13];
    $byRobotNumber->{'rch'} = $tokens->[16];
    $byRobotNumber->{'serial'} = $tokens->[3];

$ byRobotNumber显然是对哈希的引用,$ tokens是对数组的引用。

2 个答案:

答案 0 :(得分:5)

你可以使用哈希切片,在我们的例子中是hashref slices。

第一个技巧是散列片:如果// raw input, as a string string s = "\u0001\u0001\u0004\0\u0001\0\0\0"; // convert string into byte array byte[] bytes = Encoding.UTF8.GetBytes(s); Data data = new Data(); unsafe { Data* d = &data; fixed(byte* b = bytes) { *d = *((Data*)b); } } 是散列,%h是散列片,则返回与键的LIST相对应的值列表。它也可以是左值。

第二个技巧是,当你有一个hashref @h{LIST}时,$hr的行为与hash {$hr}的无标记核h的行为相同。

同样的事情也适用于数组。这导致我们:

%h

答案 1 :(得分:4)

您可以使用等号两侧的列表并行地为变量赋值:

( $byRobotNumber->{'inquiry'}, 
  $byRobotNumber->{'rch'}, 
  $byRobotNumber->{'serial'}
) = ($tokens->[13], $tokens->[16], $tokens->[3]);

OR更简单的选项是使用散列切片和数组切片:

@{$byRobotNumber}{qw/inquiry rch serial/} = @{$tokens}[qw/13 16 3/]