2013-04-17 17 views
3

有没有简单的方法来模拟脚本中-l命令行开关的效果? (当然,我可以随时chomp每一行,然后追加“\ n”来每行我打印的,但关键是要避免这样做。)如何模仿-l内部脚本

回答

5

号你可以获得的自动附加通过使用$\,但你必须自己添加chomp。

以下是-l的工作原理。

$ perl -MO=Deparse -ne 'print $_' 
LINE: while (defined($_ = <ARGV>)) { 
    print $_; 
} 

$ perl -MO=Deparse -lne 'print $_' 
BEGIN { $/ = "\n"; $\ = "\n"; }  # -l added this line 
LINE: while (defined($_ = <ARGV>)) { 
    chomp $_;      # -l added this line 
    print $_; 
} 

(的意见是我的。)请注意,在-l通过-n产生循环的开始添加文字chomp $_(和它只做如果使用-n-p)。没有变量可以设置为模仿该行为。

这是一个鲜为人知的事实,-l-n-p通过将样板文本包装在您编译前提供的代码上工作。

1

你可以把它添加到你的家当行:

#!/usr/bin/perl -l 
+1

谢谢!我以为我没有成功就尝试过这种方法,但是我一定是做了一些其他的错误,因为当我再次尝试时,它会像预期的那样工作。 – kjo

+0

不,我说得太快了:上述不适合我(自动chomp不会发生)。 – kjo

3

是,尝试家当后,使用此在脚本的开始狭窄

$/ = $\ = "\n"; # setting the output/input record separator like OFS in awk 

,并在循环使用:

chomp; 
print; 

或者这样:

use strict; use warnings; 
use English qw/-no_match_vars/; 

$OUTPUT_RECORD_SEPARATOR = "\n"; 

while (<>) { 
    chomp; 
    print; 
} 

我不推荐使用

#!/usr/bin/perl -l 

一个更好的清晰度=)

perldoc perlvar

+1

这只提供'-l'的一半功能,它也自动连接输入线。 – Borodin