gpt4 book ai didi

perl - 为什么打印 ($a = a..c) 产生 : 1E0

转载 作者:行者123 更新时间:2023-12-04 02:33:02 30 4
gpt4 key购买 nike

print (a..c) # this prints: abc  
print ($a = "abc") # this prints: abc

print ($a = a..c); # this prints: 1E0

我原以为它会打印:abc
use strict;
print ($a = "a".."c"); # this prints 1E0

为什么?只有我的电脑吗?
编辑:我有一个部分答案(范围运算符 .. 在标量上下文中返回一个 bool 值 - 谢谢)但我不明白的是:
为什么: print ($a = "a"..."c") 产生 1 而不是 0
为什么: print ($a = "a".."c") 产生 1E0 而不是 1 或 0

最佳答案

这里发生了许多微妙的事情。第一个是..实际上是两个完全不同的运算符,具体取决于调用它的上下文。在列表上下文中,它在给定的起点和终点之间创建一个值列表(递增 1)。

@numbers =  1  ..  3;  # 1, 2, 3
@letters = 'a' .. 'c'; # a, b, c (Yes, Perl can increment strings)

因为 print在列表上下文中解释其参数
print 'a' .. 'c';    # <-- this
print 'a', 'b', 'c'; # <-- is equivalent to this

在标量上下文中, ..是触发器运算符。来自 Range Operators在 perlop:

It is false as long as its left operand is false. Once the left operand is true, the range operator stays true until the right operand is true, AFTER which the range operator becomes false again.



分配给标量值,如 $a = ...创建标量上下文。这意味着 ..print ($a = 'a' .. 'c')是触发器运算符的实例,而不是列表创建运算符。

触发器运算符旨在用于过滤文件中的行。例如
while (<$fh>) {
print if /first/ .. /last/;
}

将打印文件中的所有行,以包含 first 的行开头。并以包含 last 的那个结尾.

触发器运算符有一些额外的魔法,旨在使基于行号的过滤变得容易。
while (<$fh>) {
print if 10 .. 20;
}

将打印文件的第 10 到 20 行。它通过使用特殊情况的行为来做到这一点:

If either operand of scalar .. is a constant expression, that operand is considered true if it is equal (==) to the current input line number (the $. variable).



琴弦 ac都是常量表达式,因此它们会触发这种特殊情况。它们不是数字,而是用作数字( == 是数字比较)。 Perl 将根据需要在字符串和数字之间转换标量值。在这种情况下,两个值都归为 0。因此
print ($a = 'a' .. 'c');             # <-- this
print ($a = 0 .. 0); # <-- is effectively this
print ($a = ($. == 0) .. ($. == 0)); # <-- which is really this

我们正在接近谜底。进入下一点。更多来自 perlop:

The value returned is either the empty string for false, or a sequence number (beginning with 1) for true. The sequence number is reset for each range encountered. The final sequence number in a range has the string "E0" appended to it



如果您还没有从文件中读取任何行, $.将是 undef这是 0在数字上下文中。 0 == 0是真的,所以 ..返回一个真值。这是第一个真值,所以它是 1 .因为左边和右边都是真,第一个真值也是最后一个真值, E0 “这是最后一个值”后缀附加到返回值。这就是为什么 print ($a = 'a' .. 'c')版画 1E0 .如果您要设置 $.为非零值 ..将是 false 并返回空字符串。
print ($a = 'a' .. 'c'); # prints "1E0"
$. = 1;
print ($a = 'a' .. 'c'); # prints nothing

最后一个难题(我现在可能走得太远了)是赋值运算符返回一个值。在这种情况下,这是分配给 $a 的值1 -- 1E0 .这个值是 print最终吐出来的.

1:从技术上讲,分配会为分配给的项目生成左值。即它返回变量 $a 的左值然后计算为 1E0 .

关于perl - 为什么打印 ($a = a..c) 产生 : 1E0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8003415/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com