为什么下面的use行是合法的Perl语法?(改编自用于父级的过氧化物酶;在Cygwin上的Perl 5.26.2 x64上进行测试。)
package MyHash;
use strict;
use Tie::Hash;
use parent -norequire, "Tie::StdHash";
# ^^^^^^^^^^ A bareword with nothing to protect it!在-MO=Deparse下,use行变成
use parent ('-norequire', 'Tie::StdHash');但我从文档上看不出对-norequire的引用是从哪里来的。
use strict没有生效,我会理解的。裸单词norequire将成为弦 "norequire",一元减去将将该字符串转换为"-bareword",而结果字符串将进入use导入列表。例如:
包MyHash;使用Tie::Hash;使用父-norequire,"Tie::StdHash";-foo => bar变成了"-foo", bar,因为=> "foo",然后一元减去它的魔力再次发挥作用。例如:
包MyHash;使用严格;使用Tie::Hash;使用父-norequire => "Tie::StdHash";这两个示例对use行产生相同的偏差。但是,两者都引用了原来的示例。我遗漏了什么使最初的示例(使用strict,没有=>)合法?谢谢!
发布于 2018-12-10 14:40:49
您已经引用了perldoc perlop,但它在这里是相关的。
如果操作数是数字,则一元
-执行算术否定,包括任何看起来像数字的字符串。如果操作数是标识符,则返回由与标识符连接的减号组成的字符串。..。这些规则的一个效果是,-bareword等同于字符串"-bareword"。
一元减号运算符的这种行为在应用strict检查之前应用于裸字。因此,一元减号是一种在严格模式下工作的引用运算符。
同样,作为方法调用中的调用者的裸词不需要引用,只要它们不是函数调用:
Foo->bar; # 'Foo'->bar(); --- but only if no sub Foo exists
print->bar; # print($_)->bar();但是,一元负行为似乎是由于不断的折叠,而不是因为解析器中的特殊情况。例如,这段代码
use strict;
0 ? foo : bar;只会抱怨不允许使用裸词"bar“,这意味着在解析和编译过程中,裸单词检查会发生得很晚。在一元减号的情况下,赤字已经被常量折叠成一个适当的字符串值,并且没有一个空字是可见的。
虽然这可以说是错误的,但如果不破坏向后兼容性,就不可能改变这种情况--许多模块(如use parent )都会使用这种行为来通信选项。在命令行接口上也比较类似的习惯用法,其中选项通常以破折号开头。
发布于 2018-12-10 14:40:29
来自perlop
符号一元算子
如果操作数是数字,则一元"-“执行算术否定,包括任何看起来像数字的字符串。如果操作数是标识符,则返回由与标识符连接的减号组成的字符串。否则,如果字符串以加号或减号开头,则返回以相反符号开头的字符串。这些规则的一个效果是,-bareword等同于字符串"-bareword“。但是,如果字符串以非字母字符(不包括"+“或"-")开头,Perl将尝试将字符串转换为数字,并执行算术否定。如果字符串不能清晰地转换为数字,Perl将给出警告参数"the string“不是否定(-) at .中的数字。
因此,由于Perl解析规则,-name被视为"-name“,即使在use strict下也是如此。
https://stackoverflow.com/questions/53707424
复制相似问题