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=01 提供!$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:如何解释数组和标量的否定?的主要内容,如果未能解决你的问题,请参考以下文章

5-Perl 变量

Perl语言学习,不要停哟~~

perl学习基本语法

Perl:标量,数组,哈希

Perl——标量&列表数组

请问怎么给perl里的标量,哈希,数组赋初值?