这两段代码有什么区别?
my $a = ();
print $a;
print ();
答案 0 :(得分:5)
标量赋值运算符在标量上下文中计算其操作数。存根运算符(()
)在标量上下文中求值为undef
,所以
my $a = (); # Create $a initialized to undef, then assign undef to $a.
与
相同my $a = undef; # Create $a initialized to undef, then assign undef to $a.
简化为
my $a; # Create $a initialized to undef.
print
运算符在列表上下文中计算其操作数。存根运算符(()
)计算列表上下文中的空列表,所以
print( () ); # Print no scalars, so print nothing.
与
完全不同print( $a ); # Print one scalar whose value is undef.
和
print( undef ); # Print one scalar whose value is undef.
但你没有使用
print( () );
你实际使用过
print ();
这是一种奇怪的写作方式
print();
如果您未指定任何参数,print
会打印$_
,所以
print (); # Print one scalar ($_) whose value is quite possibly undef.
相当于
print($_); # Print one scalar ($_) whose value is quite possibly undef.
如果警告已经开启,您会收到以下警告:
print (...) interpreted as function
答案 1 :(得分:4)
在第一行中,您将(空)列表的内容分配给标量$a
,因此$a
将设置为undef
。
在第二种情况下,您打印一个空的(但有效的)列表。
提示:在文件顶部添加use warnings
,您将看到尝试打印未定义变量的运行时警告。