Perl slices and references
我创建了以下切片:
1 2 3
| my %hash = ( a => 1, b => 2, c => 3 );
my @backslashed_slice_result = \@hash{qw(a b c )};
# $backslashed... <-- originally I wrote this is a scalar, see below. |
我希望这会产生对哈希切片填充的数组的数组引用,相当于:
1
| my $arrayref_containing_slice = [ @hash{qw(a b c )} ]; # [1, 2, 3] |
号
但实际上是在做类似的事情:
1
| my @mapped_list_of_values_to_refs = map { \$hash{$_} } qw(a b c ); # (\1, \2, \3) |
在描述这种行为的文档中,我可以找到的主要观点是:
A slice accesses several elements of a list, an array, or a hash
simultaneously using a list of subscripts.
号
那么,\@hash{qw(a b c)}实际上是一个列表切片,而不是一个散列切片吗?我对引用哈希值而不是结果值数组感到惊讶。导致Perl将前导的\应用于哈希值的语法是什么?
两点:
首先,散列切片不会生成数组,它会生成已切片散列元素的列表。
其次,在列表上使用会生成对第一个列表元素的引用列表。
- 我不知道列表引用行为。以下是相关文档的引述:引用枚举列表与使用方括号不同--相反,它与创建引用列表相同!@list = (\$a, \@b, \%c); @list = \($a, @b, %c); # same thing!\@语法看起来就像引用了一个数组,所以将它与散列片结合起来会让人很困惑!
- @阿达姆芯片的信号可能会令人困惑。也许来自Perldata的这一点会有所帮助:"如果您对为什么在哈希切片上使用"@"而不是"%",那么请这样想。括号的类型(方括号或花括号)控制它是一个数组还是正在查看的哈希。另一方面,数组或哈希上的前导符号("$"或"@")指示您是要返回单数值(标量)还是复数值(列表)。"
- @这是一个黑色的理由,不是解释清楚,是我的想法,但列表参考行为与它不一致。如果我们进一步推断前面的反斜杠表示"get a reference to",那么\@array表示"reference to array",\@hashslice{...}也表示"reference to array",除非它没有。:-)
- @亚当,我明白为什么这会让人困惑,尽管你的逻辑有点偏离。如果\@hashslice{...}表示"对数组的引用",那么{...}块是什么意思?我希望这会产生语法错误。另外,即使没有引用,人们也会得出同样的结论:如果@foo是一个数组,那么@foo{bar}也必须是一个数组,对吗?请记住,切片是列表,而不是数组,尽管使用了@。只是重申一下,我并不认为这些符号是直接的;实际上,它们在Perl6中已经被更改为更直观的。