我可能会遗漏一些明显的东西,但我不知道为什么以下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
原文地址:https://www.jb51.cc/Perl/171339.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。