加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

为什么Perl通过grep创建一个空数组引用?

发布时间:2020-12-15 22:04:53 所属栏目:大数据 来源:网络整理
导读:我可能会遗漏一些明显的东西,但我不知道为什么以下Perl通过 grep 创建数组引用,但不是 sort 或其他一般引用? print @$arr; # no outputprint ref $arr; # no outputprint scalar @$arr; # no outputprint ref $arr; # no outputprint sort @$arr; # no outp
我可能会遗漏一些明显的东西,但我不知道为什么以下Perl通过 grep创建数组引用,但不是 sort或其他一般引用?
print @$arr; # no output
print ref $arr; # no output
print scalar @$arr; # no output
print ref $arr; # no output
print sort @$arr; # no output
print ref $arr; # no output
print grep { 0 } @$arr; # no output
print ref $arr; # ARRAY

我可能错过了一些明显的东西,或者它可能只是其中之一,但它让我难过,我想知道是否有人知道答案……

我已经在Perl 5.8和5.10上对此进行了测试,并在两者上都获得了相同的行为.

解决方法

有趣的问题是为什么没有其他任何一个.如果它是undef,则在左值上下文中取消引用将自动生成操作数.
$perl -E'@$arr = "b"; say $arr // "[undef]"'
ARRAY(0x335b558)

参数总是通过引用传递给subs,因此它们在左值上下文中进行计算.

$perl -E'sub f { }  f( @$arr ); say $arr // "[undef]"'
ARRAY(0x284e9f8)

但是perlfunc中的“函数”实际上是运算符,因此,它们可以发明自己的语法和调用约定. Perl知道在使用默认比较函数时sort不会修改其操作数,因此它不会在左值上下文中对它们进行求值.

$perl -E'sort @$arr; say $arr // "[undef]"'
[undef]

grep将$_传递给传递给它的每个项目,因此它的参数可以被修改(即使这通常不是一个好主意),因此它的参数在左值上下文中进行计算.

$perl -E'@a = "a"; grep { $_ = uc($_) } @a; say @a'
A

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读