呼叫';标量';关于Perl中range运算符(..)的结果

呼叫';标量';关于Perl中range运算符(..)的结果,perl,scalar,range,flip-flop,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::(-

所以,我相信这与数组和列表之间的差异有关,但我不明白这里发生了什么。有人能解释一下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
$perl-de1
从perl5db.pl版本1.31加载数据库例程
编辑器支持可用。
输入h或“h”以获取帮助,或输入“man perldebug”以获取更多帮助。
main:(-e:1):1
DB x标量(1,2,3,4)
0  4
DB x标量(1..2,3,4)
0  4
DB x标量(1,2..3,4)
0  4
DB x标量(1,2,3..4)
0  ''
DB sub foo{(1..4)}#(实际的问题案例,除了4是一个变量外)
dbx标量foo()
0  ''
DB子栏{{[1..4]}}#(解决方法)
DB x标量条()
0  4
在标量上下文中不存在生成列表的“范围运算符”——
运算符在标量上下文中使用时是“触发器运算符”。触发器操作符开始返回false,继续返回false直到其左参数变为true,然后继续返回true直到其右参数变为true,然后返回false并返回其初始状态。如果所有这些听起来都毫无用处,考虑一下

while (<>) {
  print if /BEGIN/ .. /END/;
}
while(){
打印if/BEGIN//END/;
}
运算符以false开头,因此不会打印文件中的行。但是一旦regex
/BEGIN/
匹配,触发器变为true,并且将打印以下所有行,直到regex
/END/
匹配为止。从“结束”后的行开始,触发器将再次为假。因此,效果是只打印“开始”和“结束”之间的行(包括,但您可以控制)


$还有一点神奇之处。
如果两边都是常数,但这并不重要。阅读中关于触发器操作符的更多信息。

为了获得进一步的启示,请尝试
打印标量(5,6,7,8)
打印标量(@a=(5,6,7,8))
甚至
打印标量(()=(5,6,7,8))
这个操作符现在确实很流行!哇!我想我希望在列表上下文中计算表达式,然后计算标量<我想,code>perldoc-f scalar暗示了这一点,但充其量只是模棱两可:没有等价的运算符强制在列表上下文中插入表达式,因为在实践中,这是不需要的。然而,如果你真的想这样做,你可以使用结构
@{[(某个表达式)]}
,但通常一个简单的
(某个表达式)
就足够了。@fennec是的,你最初期望的根本不会发生。列表和标量上下文是不同的,除非您特别强制这样做,否则不会“在列表上下文中计算,然后计算标量”。许多操作符的行为就像是这样(在任何一个上下文中都有相同的副作用,或者在列表上下文中返回一个列表,在标量上下文中返回一个计数,或者在任何一个上下文中返回一个值),但有些操作符在一个上下文中做的事情与另一个上下文中的明显不同,这会让您感到惊讶
m//g
split
是其他需要注意的东西。是的,理论上我在某种程度上意识到了这一点,但我使用的原始代码实际上是用
scalar$x->thingy_索引计算东西
其中
sub-thingy_索引{+(1,2)}
sub-thingy_索引{+(1,2,3)}2
3
。这实际上毒害了我一天的精神bfennec:scalar的文档不是可以查看的地方,因为每个操作符在scalar vs list上下文中都有自己的想法。