是否有可能将此分配作为某种类型的数组赋值,因此它不是那么冗长?
$byRobotNumber->{'inquiry'} = $tokens->[13];
$byRobotNumber->{'rch'} = $tokens->[16];
$byRobotNumber->{'serial'} = $tokens->[3];
$ byRobotNumber显然是对哈希的引用,$ tokens是对数组的引用。
答案 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/]