Perl CORE ::说vs -E

kob*_*ame 10 perl

这个答案中使用perl one-liner作为:

perl -we '... CORE::say "x=$x"'
Run Code Online (Sandbox Code Playgroud)

使用-eCORE::say而不是更短的优点是什么:-E和普通的say,例如:

perl -wE '... say "x=$x"'
Run Code Online (Sandbox Code Playgroud)

ike*_*ami 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+)
Run Code Online (Sandbox Code Playgroud)

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

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

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

120
Run Code Online (Sandbox Code Playgroud)

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

5
Run Code Online (Sandbox Code Playgroud)

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

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