什么是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

我是个Perl新手。我想结合range操作符来理解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 ..
    
    感谢并欢迎您的指导。

    您正在标量上下文中使用,标量上下文也称为触发器运算符

    您应该阅读整个文档,但以下摘录与您的情况相关:

    在标量上下文中,“
    ”返回一个布尔值。该操作符是双稳态的,就像触发器一样,模拟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);