[英]Why does Perl treat a hash element as list context at declaration?
鑒於此代碼:
#!/usr/bin/perl -w
use strict;
use warnings;
sub foo {
return wantarray ? () : "value1";
}
my $hash = {
key1 => foo(),
key2 => 'value2'
};
use Data::Dumper;
print Dumper($hash);
我得到以下輸出:
$VAR1 = {
'key1' => 'key2',
'value2' => undef
};
當我期待:
$VAR1 = {
'key1' => 'value1',
'key2' => 'value2'
};
我知道散列是一種偶數大小的數組(由我所得到的“散列分配中的奇數元素數量”警告證明)但是散列元素只能是一個標量, 為什么編譯器會給出它的數組上下文?
我直接分配給哈希時使用CGI模塊的param函數找到了這個。 上面的foo()函數是對CGI :: param('mistyped_url_param')的調用,它返回一個空數組,破壞(旋轉?)哈希結構。
胖逗號不是特殊的哈希賦值運算符。 它只是一段語法糖意味着“自動引用前一個東西”
所以:
my $hash = {
key1 => foo(),
key2 => 'value2'
};
手段:
my $hash = {
'key1', foo(), 'key2', 'value2'
};
......這是一個清單,正如威勒特所說:
列表中的每個表達式都在列表上下文中計算。 你可以通過調用
scalar foo()
來解決這個問題
匿名哈希構造函數為其中的內容提供列表上下文,因為它需要鍵和值列表。 就是這樣,因為它就是這樣。 我們沒有辦法在代碼中表示Perl哈希,因此您必須使用我們交替鍵和值的列表。 =>
符號在視覺上幫助我們,但沒有任何魔法可以幫助Perl找出各種各樣的東西。
當前上下文傳播給子程序調用等,就像在任何其他情況下一樣。
這允許您使用列表操作構建哈希:
my $hash = {
a => 'A',
map( uc, 'd' .. 'f' ),
return_list( @args ),
z => 'Z'
};
如果您需要在標量上下文中使用某些內容,請使用scalar
:
my $hash = {
a => 'A',
map( uc, 'd' .. 'f' ),
'g' => scalar return_item( @args ),
z => 'Z'
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.