perl - 在 Perl 中强制使用列表上下文

标签 perl

我试图理解 Perl 上下文,但被一块石头绊倒了;

给定代码;

#!/usr/bin/perl

my $b = (33,22,11);
print "$b\n";

my $b = () = (33,22,11);
print "$b\n";

my @b = (33,22,11);
print "@b\n";

my @b = () = (33,22,11);
print "@b\n";

结果是(最后一行为空);
 11  

 3 

 33 22 11

 <>

由于第二次打印返回了列表的长度,我假设某处生成了一个数组,因为标量上下文中的数组计算为其长度。但是第 4 次打印似乎否定了这个假设。我期待看到'33 22 11'打印但什么也没有。这里发生了什么事?

最佳答案

你很困惑,因为你认为=是单个运算符,但它可以产生两个不同的运算符:列表赋值运算符或标量赋值运算符。 Mini-Tutorial: Scalar vs List Assignment Operator解释了差异。

my $b = (33,22,11);
------------------            Scalar assign in void context.
        ----------            List literal in scalar context. Returns last.

my @b = (33,22,11);
------------------            List assign in void context.
        ----------            List literal in list context. Returns all.

my $b = ( () = (33,22,11) );
---------------------------   Scalar assign in void context.
        -------------------   List assign in scalar context. Returns count of RHS
               ----------     List literal in list context. Returns all.

my @b = ( () = (33,22,11) );
---------------------------   List assign in void context.
        -------------------   List assign in list context. Returns LHS.
               ----------     List literal in list context. Returns all.

至于你的标题,强制列表上下文是不可能的。如果函数在需要标量时返回一个列表,则会导致堆栈中出现额外的值,从而导致运算符获取错误的参数。

但是,您可以执行以下操作:
( EXPR )[0]

或者
( EXPR )[-1]
EXPR将在列表上下文中调用,但整体将仅返回返回列表的一个元素。

关于perl - 在 Perl 中强制使用列表上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17136232/

相关文章:

perl - perl 中的模式匹配和正则表达式?

regex - Perl 正则表达式问题

regex - 替换为编号值

perl - 如何在此Perl语句中找到编译错误?

perl - 如何确保 Perl 脚本适用于旧版本?

perl - 初始化 Moose 类的 CodeRef 字段

perl - 在 Perl 中将位向量转换为二进制

perl - 为什么我的Perl祝福的文件句柄不使用 `can(' print')`'返回true?

perl - 调用 perl 脚本

perl - 我如何在树中 move 到下一个 child ?