我只是尝试在Perl中使用+
运算符连接数组并得到奇怪的结果:
perl -wE 'say([1, 2, 3] + [4, 5, 6])'
73464360
对哈希执行相同操作似乎是语法错误:
perl -wE 'say({} + {})'
syntax error at -e line 1, near "} +"
Execution of -e aborted due to compilation errors.
第一个表达的结果是什么?是否记录在哪里?
答案 0 :(得分:7)
它来自引用的数量,它产生引用的内存地址。
perl -E 'say \@a; say 0+\@a; printf "%x\n",0+\@a'
典型输出(尽管每次运行程序时都可能会改变)
ARRAY(0x1470518)
21431576
1470518 <--- same number as in first line
您的哈希引用示例几乎可以正常工作,但似乎Perl正在将第一组{}
块解析为代码块而不是哈希引用。如果您使用一元+
并强制Perl将其视为哈希引用,它将起作用。我的意思是“工作”。
perl -E 'say(+{} + {})'
40007168
答案 1 :(得分:3)
因为Perl中的+
只是算术运算符。它迫使其论点被解释为数字,无论如何。这就是为什么Perl有一个单独的字符串连接运算符(.
)。
有效的做法是添加存储数组的地址。
通过简单地列出数组,一个接一个地完成数组连接。但是,如果您使用对数组的引用([
... ]
),则必须先使用@{
... }
取消引用它们:
perl -wE 'say( @{[1,2,3]}, @{[4,5,6]} )'
但通常你会使用数组变量而不需要额外的语法。
perl -wE 'my @a = (1,2,3); my @b = (4,5,6); say join("-",@a,@b)'
#=> 1-2-3-4-5-6
哈希也是如此; my %c = (%a,%b);
会合并%a
和%b
的内容(按此顺序,以便%b
的任何公共密钥的值都会覆盖%a
的)进入新的哈希%c
。您可以使用my $c = { %$a, %$b };
对引用执行相同的操作。您在+
尝试中遇到的一个问题是{}
可能被解释为空代码块而不是空哈希。