在this answer中使用perl one-liner作为:
perl -we '... CORE::say "x=$x"'
使用-e
和CORE::say
代替较短的-E
和普通say
有什么好处,例如:
perl -wE '... say "x=$x"'
答案 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使用,而其他功能与其引入之前编写的程序不同。