两个陈述之间不同

时间:2014-08-08 14:26:35

标签: perl

这两段代码有什么区别?

my $a = ();

print $a;

print ();

2 个答案:

答案 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,您将看到尝试打印未定义变量的运行时警告。