什么是Perl上下文和范围运算符?
我是个Perl新手。我想结合range操作符来理解Perl上下文。这是我的密码什么是Perl上下文和范围运算符?,perl,Perl,我是个Perl新手。我想结合range操作符来理解Perl上下文。这是我的密码 use strict; use warnings; my $asc = ( 10 .. 50 ); print "$asc\n"; 我有两个疑问 如果表达式(10..50)返回一个数组,那么,由于它是标量上下文,“asc”变量应该被分配数组的长度,即41 如果表达式(10..50)返回一个列表,那么,由于它是一个标量上下文,“asc”变量应该被分配到列表中的最后一项,即50 但是,我听到下面的喊声 Use of
use strict;
use warnings;
my $asc = ( 10 .. 50 );
print "$asc\n";
我有两个疑问
Use of uninitialized value in range (or flip) at main.pl line ..
感谢并欢迎您的指导。您正在标量上下文中使用,标量上下文也称为触发器运算符
您应该阅读整个文档,但以下摘录与您的情况相关:
在标量上下文中,“。
”返回一个布尔值。该操作符是双稳态的,就像触发器一样,模拟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";
产出:
41
50
如果表达式(10..50)返回一个数组,那么,由于它是标量上下文
如果表达式(10..50)返回一个列表,那么,由于它是标量上下文
你有一些非常不正确的误解
- 无法返回数组[1]。只能返回零个或多个标量。在标量上下文中,该列表的长度必须正好是一个标量
- 标量上下文导致运算符更改其返回的内容;它不会导致将返回的值强制转换为标量
。
),甚至根据上下文更改行为。事实上,标量上下文中的范围运算符的行为与列表上下文中的行为明显不同。因此,当它在标量上下文中时,通常使用不同的名称来调用它:触发器运算符
这个问题并不是关于触发器操作符的,所以我不打算详细讨论。(它的文档是。)只需说它可以用很少的代码按数字选择性地打印行
比如说,
while (<DATA>) {
print if 2..3;
}
__DATA__
aaa
bbb
ccc
ddd
eee
“魔法”的一部分是将提供的数字与最后一行的行号进行比较
my $ac = 10..50;
是的缩写
my $ac = ($. == 10) .. ($. == 50);
由于从未从文件中读取,$。
未定义
返回@array;
,则返回数组的元素($array[0]、$array[1]、…
)或其长度,具体取决于上下文my $ac = ($. == 10) .. ($. == 50);