7

在 Perl 中,可以使用 Perl 内置函数或使用 system() 调用 shell 命令来实现某些目标。问题是,对于作为 Perl 初学者的我来说,有时很难找到与 Linux 命令等效的 Perl。
以这个为例:

cat file1 file2 | sort -u > file3

我真的想只使用 Perl 函数来使我的 Perl 更加 Perl,但是在这种情况下我无法轻松找出如何避免使用 system() 。

所以我想知道,使用 Perl 库函数比使用 system() 调用有什么优势吗?哪个是更好的方法?

4

5 回答 5

11

通常,使用库函数的优势在于,当出现问题时,您可以给出有意义的错误消息。

对于短期脚本或当开发资源非常宝贵时,使用 system 代替是有意义的。

于 2013-11-12T07:07:42.617 回答
9
local $^I;
local @ARGV = qw(file1 file2);
open my $fh, ">", "file3" or die $!;
my %s;

# print {$fh} (LIST) # or using foreach:
print $fh $_ for
  sort
  grep !$s{$_}++,
  <>;

主要优点是可移植性并且没有系统依赖性。

更明确的版本,

use List::MoreUtils qw(uniq);
local $^I;
local @ARGV = qw(file1 file2);
open my $fh, ">", "file3" or die $!;

for my $line (sort uniq readline()) {
  print $fh $line;
}
于 2013-11-12T07:13:15.793 回答
4

使用 perl 库。节省了处理器在生成另一个进程时的工作量。当出现问题时,还能够获得更好的指示。

于 2013-11-12T07:44:40.957 回答
1

您当然可以使用mpapec指出的 Perl 脚本版本。但是Asif Idris指出的使用system或版本有一些优势。例如,如果您需要对大量数据进行排序,使用系统命令将使您走得更远,痛苦更少。使用 perl 对几 GB 进行排序是 PITA,但对于系统命令来说这没什么大不了的,您甚至会使用所有内核和更少的内存。opensortsort

于 2013-11-12T09:06:45.387 回答
1

如果您想执行系统命令并使其失效,我建议您使用 open()。

open(fh,"cat test.txt text_file.txt | sort -u >new_file.txt | ");

这使您的程序简单易懂。perl 中为系统命令提供的支持是它的优点之一。所以最好按原样使用它,而不是为了使您的代码“Perlish”而进行整个过程'。

于 2013-11-12T07:57:35.263 回答