perl - 在 Perl 中对范围运算符 (..) 的结果调用 'scalar'

标签 perl scalar range flip-flop

所以,我相信这与数组和列表之间的区别有关,但我不明白这里发生了什么。谁能解释一下 Perl 如何以及为什么对待像 (1..4) 这样的表达式不同于 (1, 2, 3, 4)@{[1..4]} ?

$ perl -de1

Loading DB routines from perl5db.pl version 1.31
Editor support available.

Enter h or `h h' for help, or `man perldebug' for more help.

main::(-e:1): 1
  DB<1> x scalar (1,2,3,4)
0  4
  DB<2> x scalar (1..2,3,4)
0  4
  DB<3> x scalar (1,2..3,4)
0  4
  DB<4> x scalar (1,2,3..4)
0  ''
  DB<5> sub foo { (1..4) } # (the actual problem case, except 4 would be a variable)
  DB<6> x scalar foo()
0  ''
  DB<7> sub bar { @{[1..4]} } # (the workaround)
  DB<8> x scalar bar()
0  4

最佳答案

产生列表的“范围运算符”在标量上下文中不存在——..运算符在标量上下文中使用时是“触发器运算符”。触发器运算符从返回假开始,继续返回假直到其左参数变为真,然后继续返回真直到其右参数变为真,之后返回假并返回其初始状态。如果所有这些听起来都很无用,请考虑

while (<>) {
  print if /BEGIN/ .. /END/;
}
..运算符以 false 开头,因此不会打印文件中的行。但是一旦正则表达式 /BEGIN/匹配,触发器变为真,并且将打印以下所有行,直到正则表达式 /END/火柴。从“END”之后的行开始,触发器将再次为假。所以效果是只打印(包括,但你可以控制)“BEGIN”和“END”之间的行。
$. 更有魔力如果任一方是恒定的,但这并不重要。在 perldoc perlop 中阅读有关触发器运算符的更多信息.

关于perl - 在 Perl 中对范围运算符 (..) 的结果调用 'scalar',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3367182/

相关文章:

python - 如何使输入接受空格?

f# - 在 f# 中是否有用于测试一个数字是否在其他两个数字之间(在一个范围内)的语言结构?

date - 如何在考虑日期范围的elasticsearch中创建直方图

java - 我如何将这个 Perl 正则表达式翻译成 Java?

python - 从变量中的值构造pandas DataFrame给出 "ValueError: If using all scalar values, you must pass an index"

java - 缩放线段 - Java

Perl 条件不替代标量值

perl - 如何建立哈希数据结构

perl - 如何在Perl中实现调度表?

css - 在哪里放置 perl cgi 脚本的 css 文件?