2011-07-18 34 views
7
#!/usr/bin/perl 
use warnings; 

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

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

为什么Perl不支持双引号内的散列插值?它支持标量($),数组(@)的插值,那么为什么不用于散列(%)呢?Perl为什么不支持双引号中的散列插值?

+2

我不认为Perl食谱是免费提供的,合法的 – MkV

+0

雅,这是非法的。 –

+2

解决方法是将散列施加到数组引用,然后对其进行解引用:'print“@ {[%hash]}”' – mob

回答

15

应该如何将散列串化?标量是显而易见的,也是数组。但是散列应该是什么?这样的字符串化会有多大用处?它是否比使用插值字符串中未转义的%字符更有用或更少?为了修复今天在插入字符串中使用%的所有代码,需要花费多少工作量?

如果你能想出这些问题的良好答案,那么我相信P5P会愿意倾听他们的意见。

+0

我有点惊讶哈希的插值被认为与数组的差别很大,被认为是'不需要的'。我可以知道为什么需要数组的串化,而哈希不是? – Salil

+0

@Salil为了向后兼容,需要对数组进行字符串化如果可以从语言中删除它, Perl 6没有数组插值,而是使用表达式插值,结果更好:'“{@ a.join(',')}”'和'“{%h.perl}”' –

21

要引用Nathan Torkington的话:“最大的问题是,%大量用于带有printf的双引号字符串。”更多信息是here

+0

感谢您的链接。 –

4

对于“为什么”并非真正的答案,但我想我会指出“如何”的各种答案。

一个当然可以,请尝试:

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

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

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

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

如果你想甩散列或任何其他复杂的数据结构的内容,使用Data::DumperYAMLJSON取决于你的使用情况。

+0

检查查斯欧文斯的评论对我的问题。 –

+0

哎呀!我错过了那个评论。我想我会留下这个答案,以防其他人错过评论。 –

+0

雅,那很好。 –

相关问题