簡體   English   中英

為什么Perl在聲明時將哈希元素視為列表上下文?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM