Perl:如何解释数组和标量的否定?
Posted
技术标签:
【中文标题】Perl:如何解释数组和标量的否定?【英文标题】:Perl: How is to be interpreted a negation of an array and scalar? 【发布时间】:2022-01-14 17:48:50 【问题描述】:如果我对数组或标量进行求反会发生什么?使用下面的脚本我得到了这些结果:
$x = 0
-------------
$x: 0
!$x: 1
$x = 1
-------------
$x: 1
!$x:
@x = ()
-------------
@x:
!@x: 1
@x = qw ( a b )
-------------
@x: ab
!@x:
我想如果我对非空数组或标量进行否定,我将得到''
,这意味着在布尔上下文中false
。这是正确的吗?
有没有办法让它“可见”?
我想知道为什么$x=1;
为!$x
提供''
而不是0
,因为$x=0
为1
提供!$x
。
这里我假设每种 TRUE 对象如果被否定,都会给出 ''
,如果被否定,每种 FALSE 对象都会给出 1。
写完这一切后,我意识到 Perl 是非常一致的。尽管如此,“标准”FALSE 是 ''
(不可见)让我感到不舒服。
代码:
my $x = 0;
print "\$x = 0\n-------------\n";
print "\$x: ",$x,"\n"; # 0
print "!\$x: ",!$x,"\n\n"; # 1
print "\n";
$x = 1;
print "\$x = 1\n-------------\n";
print "\$x: ",$x,"\n"; # 1
print "!\$x: ",!$x,"\n\n"; # (empty?)
my @x = ();
print "\@x = ()\n-------------\n";
print "\@x: ",@x,"\n"; # a b
print "!\@x: ",!@x,"\n\n"; #
@x = qw ( a b );
print "\@x = qw ( a b )\n-------------\n";
print "\@x: ",@x,"\n"; # 1
print "!\@x: ",!@x,"\n"; # (empty?)
【问题讨论】:
【参考方案1】:!
(非)运算符将其参数置于标量上下文中。标量上下文中的数组返回它的大小——它包含多少元素。所以在你的情况下,当你这样做时
!@x
你实际上是在做:
!2
正如你提到的,哪个是空字符串,而不是0
。
它不是不可见的,但是您用来显示它的方法没有显示它。例如,您可以使用 Data::Dumper
模块打印它:
use Data::Dumper;
print Dumper !@a;
将打印
$VAR1 = '';
【讨论】:
Re "如您所说,这是空字符串,而不是0
.",不正确。它是一个包含空字符串和0
的标量。实际上,它包含两个0
:作为IV 和作为NV。试试perl -we'my $x = ""; $x + 0;'
和perl -we'my $x = (!1); $x + 0;'
@ikegami 我想 IV 和 NV 表示整数值和双精度值。如果我同时运行这两个代码,我会得到Argument "" isn't numeric in addition (+) at -e line 1.
和0
作为第一个代码的结果,而0
对于第二个代码没有警告。这意味着''
是一个字符串(导致警告),但在上下文中它被视为0
,这就是结果为0
的原因。为什么print !1
不输出0
?一个标量怎么可能包含两个值''
和0
?
@giordano, print
需要一个字符串,因此它将使用标量中的字符串。 + 0
需要一个数字,所以它会使用标量中的数字。以上是关于Perl:如何解释数组和标量的否定?的主要内容,如果未能解决你的问题,请参考以下文章