在Perl中,何时在文字中使用胖逗号键/值语法而不是将其作为哈希类型结构?

时间:2017-05-18 01:38:52

标签: perl

有人向我指出,("key" => "value", "key2" => "value2") 是一个哈希文字,而是一个列表,它的解释方式取决于你使用它的上下文。

我个人认识的其他任何语言都没有像这样的键/值语法,除了作者打算创建哈希/ map / associative-array / dictionary / etc之外,还可以解释任何其他语言,所以我发现这个方面perl有点难以掌握。

perl中有哪些上下文,您将使用该语法而不打算创建这样的数据结构,其中它旨在以键/值对没有角色的方式工作?

4 个答案:

答案 0 :(得分:7)

任何时候你想在胖字逗号的左边自动引用一个裸字:

system ls => '-lh';

 my $x = [ a => [ 1, 2 ], b => [ 3, 4 ] ];

任何时候你认为它使代码更容易看到

join ', ' => @data;

任何时候你想说“进入”:

 bless { value => 5 } => $class;

=>是逗号,简单明了。您可以在任何可以使用逗号的地方使用它。 E.g:

 my $z = f($x) => g($y); # invoke f($x) (for its side effects) and g($y)
                         # assign the result of g($y) to $z

只是因为有一件事出现在逗号的左侧,另一件事出现在逗号的右侧,这并不意味着这两件事构成了键值对。

当然,如果你打算引用一切:

 my %x = ("key", "value", "key2", "value2");

或者如果你想引用任何内容

 my %y = qw(key value key2 value2);

都是有效的构造。

因此,对于哈希的存在,胖逗号的存在既不是sufficient也不是necessary条件。

答案 1 :(得分:4)

我经常使用它来拨打system

my $rc = system $command,
    -count    => 24,
    -file     => $filename,
    -verbose  => # no value
    -frobnitz => 'blat';

任何时候我想要一个视觉指示,这两个值一起使用,我使用胖逗号。

答案 2 :(得分:4)

=>,是同一个运营商。它们可以互换使用。它们与哈希无关。

print($x, "\n");   ===   print($x => "\n");
$x=1, $y=2, $z=3;  ===   $x=1 => $y=2 => $z=3;

唯一的区别是=>会自动引用紧接在其之前的标识符。

答案 3 :(得分:1)

即使这可能不是这种情况的原因,但是对于这种情况,一种可能的用途是当您希望为同一个键具有多个值但仍希望保持“平坦”结构时(即没有)嵌套数组或散列)。

然后,您可以将这样的列表读作键值对。

示例:

do_something(user => 1, user => 2, user => 3, action => "whatever");

sub do_something
{
    while (@_)
    {
       my $key = shift @_;
       my $value = shift @_;
       # ... do something with that key-value pair
    }
}

只要将该列表转换为哈希值,重复键就会生成一个条目(最后一个)。

另请注意,“上下文”非常简单:如果将其分配给哈希:

%hash = (a => 1, b => 2)

或将其封装在{}

中的hashref文字中
$hashref = { a => 1, b => 2}

然后你得到一个哈希值,否则它仍然是一个列表。

请注意,key => value表示法只是众多可能表示法之一,您也可以使用qw表示法:

%hash = qw(a 1 b 2);