为什么Perl不支持在双引号中插值哈希?

8
#!/usr/bin/perl
use warnings;

my %hash=("no1"=>1, 
        "no2"=>2,
      );

print %hash; #Prints no11no22
print "%hash"; #Prints %hash

为什么Perl不支持在双引号内插入哈希值?它支持标量($), 数组(@)的内插,那为什么不支持哈希(%)的内插呢?


2
我认为Perl Cookbook在法律上并不是免费提供的。 - MkV
2
一种解决方法是将哈希转换为数组引用,然后对其进行取消引用操作:print "@{[%hash]}" - mob
1
@mob 但这不是一个好的解决方法,考虑哈希my%h =(“foo bar”=>“foo”,“bar foo”=>“foo”)。您将无法确定哪些是键,哪些是值。更好的解决方案是使用某种序列化形式,如YAMLJSON等。 - Chas. Owens
@Chas. Owens - 嗯。对于数组 @a=("foo","bar foo","bar");print "@a",你也无法确定一个元素何时结束,下一个元素何时开始。 - mob
@mob 你两年后才回复!哈哈 :D - Chankey Pathak
@mob 很有趣,我没有问题告诉你它们在哪里结束:$"=",";print "@a"。当然,你可以添加一些全局变量来控制哈希的打印方式,但更多的全局变量是 Perl 最不需要的,特别是当将数据序列化为字符串是 YAML、JSON 等已经解决的问题时。 - Chas. Owens
3个回答

21

引用 Nathan Torkington 的话说:“大问题在于%符号在带有格式化(printf)的双引号字符串中被广泛使用。” 更多信息请参见此处


15

如何对哈希进行字符串化?标量和数组很明显,但哈希应该怎么办?这样的字符串化有多有用?它比在插值字符串中能够不转义使用%字符更有用还是不那么有用?花费时间来修复所有今天在插值字符串中使用%的代码值得吗?

如果您能够对这些问题提出好的答案,我相信P5P会愿意倾听。


我有点惊讶哈希的插值被认为与数组的插值大不相同,并被认为是“不必要的”。请问为什么需要数组的字符串化而不需要哈希的字符串化呢? - Salil
@Salil 数组的字符串化是为了向后兼容性而需要的。如果可以从语言中删除它,那么可能会这样做。事实上,Perl 6没有数组插值。它有表达式插值,这样做效果更好:"{ @a.join(',') }""{ %h.perl }" - Chas. Owens
“哈希应该如何字符串化?”其他编程语言如Java都可以很好地处理。 - JL_SO

4

虽然我不能回答“为什么”,但我可以提供各种回答“如何”的方法。

当然,我们可以尝试以下方法:

#!/usr/bin/perl
use warnings; use strict;

my %hash = (
    "no1" => 1,
    "no2" => 2,
);

print "@{[ %hash ]}\n";

但是,我不知道那会有什么用。

如果您想转储哈希或任何其他复杂的数据结构,请根据您的使用情况使用 Data::DumperYAMLJSON


请查看Chas.Owens在我的问题中的评论。 - Chankey Pathak
哎呀!我错过了那个评论。我想我会把这个答案留下来,以防其他人也错过了这个评论。 - Sinan Ünür
1
你可以总是这样说 "@{[ map { "$_ => $hash{$_}\n" } keys %hash]}",但那有点傻。 - Chas. Owens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接