perl - 反引号与 PERL 中的本地做事方式

标签 perl bash

考虑这两个片段:

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

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

两者都会打印文件input.txt的内容作为输出

问题:是否有任何标准,关于哪一个(反引号native-method)应该优先于另一个,在任何特定情况或两者总是相等的??

我问这个问题的原因是因为我发现 cat 方法比使用原生 perl 方法打开文件更容易,所以,这让我怀疑如果我可以通过反引号方式实现某些目标,我应该继续使用它还是更喜欢其他本地方式来做这件事!!

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

最佳答案

尽可能使用内置函数:

  • 它们更便携: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 文本,您可以添加编码层:

    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";

关于perl - 反引号与 PERL 中的本地做事方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22168505/

相关文章:

linux - 如何定期调用Logstash?

bash - Bash正则表达式查找替换

linux - 在 linux 中使用带有 find 命令的管道

windows - 视频卡在 Perl 脚本中的 system(1, @commands) 上

perl - 如何在 Perl 中使用任意长度的整数?

linux - 递归地将文本添加到文件名

linux - .bashrc 的奇怪行为

windows - 使用 Perl 轮询进程退出

javascript - 在 Google Maps API 中显示多个 map 标记

perl:使用字符串作为代码片段