调用像ls或rm这样的二进制文件是不是很糟糕的Perl练习?

时间:2012-11-27 20:03:48

标签: multithreading perl process fork

我觉得perl很容易做以下事情:

   print "File not found, valid files are:\n\n".`ls DIRECTORY | grep 'php'`;

   `rm -rf directory`

   my @files_list = split("\n", `ls DIRECTORY | grep 'FILE_NAME_REGEX'`)

做这些事情是不好的做法吗?我觉得这样做要比煞费苦心地实施每件事情要容易得多。我将Perl视为bash的高级版本。

5 个答案:

答案 0 :(得分:12)

使用外部二进制文件是:

  1. 非常低效
  2. 可能不安全
  3. 不便携(thx @friedo)
  4. lazy ...在大多数情况下,有一个Perl模块,如果你找到它就会做你想做的事。
  5. 在这种特殊情况下,请查看File::Glob模块。

答案 1 :(得分:7)

这取决于程序的预期寿命。如果它只是你自己要使用的东西,或者它意味着一次性,那就完全没问题了。这就是它最初的设计目标:“最初设计为UNIX操作系统的粘合语言......”(Perl编程,第2版,第ix页)。

另一方面,如果它是一个旨在大量使用,分布广泛,在多个操作系统上运行等的程序,那么最好使用内置版和通过CPAN提供的许多软件包。

无论哪种方式,你应该总是使用unlink函数而不是调用rm,grep或map函数而不是调用grep。

答案 2 :(得分:5)

现在提出反对意见。 TMTWOTDI,正如@ transistor1在评论中所说。我也可以调用Perl的whipituptitude的力量。如果cpmvFile::Copy模块更熟悉,如果您不担心可移植性,并且您的程序可以承担因启动额外流程而导致的性能损失或者两个(暗示:它可能),Perl可以很容易地将这些工具集成到您的程序中,并且没有任何东西 - 没有 - 使用任何可用的工具来尽快完成任务。< / p>

哎呀,有时会有一些一次性的任务,即使你知道如何在Perl中完成工作,Unix工具也是正确的工具。

# I need log.err plus the next two oldest and the next two newest 
# files in the current directory. Should I say

chomp(@f = qx[ls -t | grep -C2 log.err]);

# or

@e = sort { -M $a <=> -M $b } glob("*");
($i) = grep { $e[$_] eq 'log.err' } 0..$#e;
@f = @e[$i-2 .. $i+2];

# or

use Acme::OlderNewer::FileFinder;
@f = find_oldernewer_files(".", "log.err", -2, +2);

# ?  Or suppose I want a list of all the *.pm files under all 
# directories in @INC, and we lucked out so that nothing in @INC
# has any spaces or special characters. 
# Is my script any less useful for saying

chomp(@f = `find @INC -name \\*.pm`);

# than

use File::Find;
find( sub { /\.pm$/ && push @f, $File::Find::name }, @INC );

答案 3 :(得分:4)

使用反引号通常较慢且有些不安全,并且根据您想要的操作,perl并不困难,您只需要知道该怎么做。例如:

print "File not found, valid files are\n\n", grep /php/, glob 'DIRECTORY/*';
unlink glob 'directory/*'; 
rmdir 'directory';
my @files = grep /REGEX/, glob 'DIRECTORY/*';

Perl是为了适应懒惰而设计的,但你使用bash执行的大多数常规操作都可以在perl中轻松完成。不学习如何做是你的电话,但我想如果你做了很多,它会让你的事情变得更容易。

答案 4 :(得分:0)

与大多数工程问题一样,答案是“那取决于。”。

将Perl作为脚本语言进行处理会牺牲可移植性,可维护性,执行速度以及在最短时间内完成任务之前获取任务的其他属性。做出这些牺牲的后果并不是一成不变的,而是一个程序复杂性的函数。你的程序越复杂,你在可维护性方面支付的费用就越多,你获得的支持就越多,你就越有可能通过炮击来做出错误的选择。

这里没有普遍正确的答案。在某些情况下,您需要一个脚本才能工作一次。在其他情况下,你需要它工作几次,但它很短。而在其他情况下,您正在为数百个源文件编写数万行的应用程序。使用它的场景决定了哪种工具最合适,而不是某种完美的规则。

有时,你会看到这种方法被嘲笑为“懒惰”。这就是它的本质。当你的参数发生变化时,你是否考虑到上述内容并保留改变方法的意愿,这决定了你是在进行好的懒惰还是糟糕的懒惰。真正懒惰的人知道有时最懒的事情就是重新开始。