反叛与本地的PERL做事方式

时间:2014-03-04 09:56:12

标签: perl bash

考虑这两个片段:

#!/bin/bash/perl
open(DATA,"<input.txt");
while(<DATA>)
{
  print($_) ;
}

$abcd = `cat input.txt`;
print $abcd;

两者都将print文件input.txt的内容作为输出

问题:是否有任何标准,关于哪一个(反引号原生方法)应优先于另一个,任何特定情况或两者都是相等的总是??

我问这个的原因是因为我发现cat方法比使用原生perl方法open文件更容易,所以,这让我怀疑如果我可以通过反复的方式实现某些目标,我是否应该使用它或者更喜欢其他本地方式 !!

我也检查了这个帖子: What's the difference between Perl's backticks, system, and exec? 但它的路线与我的怀疑不同!!

2 个答案:

答案 0 :(得分:7)

尽可能使用内置函数:

  • 它们更具可移植性:open适用于Windows,而`cat input.txt`则不适用。

  • 它们的开销较小:使用反引号会fork,执行一个解析命令的shell,它执行cat程序。这不必要地加载了两个程序。这与内置Perl函数的open形成对比。

  • 它们使错误处理更容易。 open函数会在出错时返回false值,这样您就可以采取不同的操作,例如比如使用错误消息终止程序:

    open my $fh, "<", "input.txt" or die "Couldn't open input.txt: $!";
    
  • 他们更灵活。例如,如果您的数据不是Latin-1 text:

    ,则可以添加编码图层
    open my $fh, "<:utf8", "input.txt" or die "Couldn't open input.txt: $!";
    open my $fh, "<:raw", "input.bin" or die "Couldn't open input.bin: $!";
    

如果您想要“只是将此文件读入标量”功能,请查看File::Slurp模块:

use File::Slurp;

my $data = read_file "input.txt";

答案 1 :(得分:3)

使用后退操作符调用cat是非常低效的,因为:

  1. 它产生一个单独的进程(如果使用shell,可能会多于一个进程),它只会读取文件,perl可以自行完成。

  2. 您正在将整个文件读入内存,而不是一次处理一行。好的,对于一个小文件,对大文件来说不太好。

  3. 后退勾选方法适用于快速而脏的脚本,但我不会将其用于任何严重的事情。