Perl CORE ::说vs -E

时间:2017-04-28 16:55:51

标签: perl

this answer中使用perl one-liner作为:

perl -we '... CORE::say "x=$x"'

使用-eCORE::say代替较短的-E和普通say有什么好处,例如:

perl -wE '... say "x=$x"'

2 个答案:

答案 0 :(得分:10)

引入了

feature.pm以允许向后添加不兼容的功能到Perl。 -E启用所有向后不兼容的功能,这意味着如果您升级-E,使用perl的程序可能会中断。

perl               -E'... say "foo";       ...'   # Forward-incompatible (5.10+)
perl -Mfeature=say -e'... say "foo";       ...'   # ok (5.10+)
perl -Mv5.10       -e'... say "foo";       ...'   # ok (5.10+)
perl -M5.010       -e'... say "foo";       ...'   # ok (5.10+)
perl               -e'... CORE::say "foo"; ...'   # ok (5.16+)

例如,假设您在2010年编写了以下程序:

perl -E'sub fc { my $acc=1; $acc*=$_ for 2..$_[0]; $acc } say fc(5);'

使用2010年最新的Perl(5.12),该程序输出以下内容:

120

使用2016年最新的Perl(5.24),该程序输出以下内容:

5

差异是由于在5.16中添加了一个功能,在启用时会改变该程序的含义。如果一个人避免使用-E,程序的行为就不会改变。具体而言,5.24中的以下输出120

perl -e'sub fc { my $acc=1; $acc*=$_ for 2..$_[0]; $acc } CORE::say fc(5);'

答案 1 :(得分:4)

你可以看到这样的区别:

C:\> perl -MO=Deparse -E "say"
use feature 'current_sub', 'evalbytes', 'fc', 'postderef_qq', 'say', 'state', 'switch', 'unicode_strings', 'unicode_eval';
say $_;

这是perl 5.24.1现在,没有-E

C:\> perl -MO=Deparse -e "CORE::say"
CORE::say $_;
-e syntax OK

-E中包含的功能集将在更高版本(例如子程序签名)中更改,其中批量包含可能会破坏现有程序。另一方面,后者将与版本5.16一起使用,之后将作为@ikegami listed使用,而其他功能与其引入之前编写的程序不同。