有人向我指出,("key" => "value", "key2" => "value2")
不是一个哈希文字,而是一个列表,它的解释方式取决于你使用它的上下文。
我个人认识的其他任何语言都没有像这样的键/值语法,除了作者打算创建哈希/ map / associative-array / dictionary / etc之外,还可以解释任何其他语言,所以我发现这个方面perl有点难以掌握。
perl中有哪些上下文,您将使用该语法而不打算创建这样的数据结构,其中它旨在以键/值对没有角色的方式工作?
答案 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 = { a => 1, b => 2}
然后你得到一个哈希值,否则它仍然是一个列表。
请注意,key => value
表示法只是众多可能表示法之一,您也可以使用qw
表示法:
%hash = qw(a 1 b 2);