我是 Perl 新手。我想结合范围运算符来理解 Perl 上下文。这是我的代码。
use strict;
use warnings;
my $asc = ( 10 .. 50 );
print "$asc\n";
我有两个疑问。
如果表达式 ( 10 .. 50 ) 返回一个数组,那么,由于它是标量上下文,因此应为“asc”变量分配数组的长度,即 41。
如果表达式 ( 10 ..50 ) 返回一个列表,则由于它是标量上下文,因此应将“asc”变量分配给列表中的最后一项,即 50。
但是,我听到以下喊声..
Use of uninitialized value in range (or flip) at main.pl line ..
感谢并欢迎任何指导。
您正在与范围运算符.. http://perldoc.perl.org/perlop.html#Range-Operators在标量上下文中,也称为触发器运算符。
您应该阅读整个文档,但以下摘录与您的情况相关:
在标量环境中,“..
" 返回一个布尔值。该运算符是双稳态的,就像拖鞋,并模拟 sed、awk 和各种编辑器的行范围(逗号)运算符。
...
如果标量 " 的任一操作数..
" 是一个常量表达式,如果该操作数等于 (==
)到当前输入行号($.
多变的)。
“确切的”错误消息解释了发生的情况:
Use of uninitialized value $. in range (or flip)
基本上,Perl 将这种用法解释为触发器测试。
它正在测试当前行号是否$.
等于您指定的整数值:
my $asc = ( $. == 10 .. $. == 50 );
但是,由于您尚未读取文件句柄,因此$.
变量未初始化并引发警告。
实现列表上下文
可以获得您所描述的列表上下文行为,但您需要调整代码以使您的意图更加明确:
my $count = () = (10..50); # Forces a list context
my $last_element = (10..50)[-1]; # Also forces a list context
print "$count\n";
print "$last_element\n";
Outputs:
41
50
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)