【问题标题】:Perl: How is to be interpreted a negation of an array and scalar?Perl:如何解释数组和标量的否定?
【发布时间】: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?)

【问题讨论】:

    标签: arrays perl scalar


    【解决方案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 需要一个数字,所以它会使用标量中的数字。
    猜你喜欢
    • 2013-07-03
    • 1970-01-01
    • 2015-03-28
    • 2022-09-30
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 2013-07-11
    相关资源
    最近更新 更多