3

我发现在 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 的高级版本。

4

5 回答 5

12

使用外部二进制文件是:

  1. 非常低效
  2. 可能不安全
  3. 不可移植(谢谢@friedo)
  4. 懒惰的......在大多数情况下,如果您寻找它,有一个 Perl 模块会做您想做的事情

在这种特殊情况下,请查看File::Glob模块。

于 2012-11-27T20:09:00.763 回答
7

这有点取决于程序的预期寿命。如果它是您只打算自己使用的东西,或者它是一次性的,那很好。这就是它最初的设计目的:“最初设计为 UNIX 操作系统的胶水语言……”(Programming Perl,第 2 版,第 ix 页)。

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

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

于 2012-11-27T20:24:48.420 回答
5

现在提出不同意见。TMTWOTDI,正如@transistor1 在评论中所说。我还可以调用 Perl 的Whitituptitude 功能。如果你比模块更熟悉cp,如果你不担心可移植性,如果你的程序可以承受启动一两个额外进程的性能损失(提示:它可能可以),Perl 可以很容易地将这些工具集成到您的程序中,使用任何可用的工具尽可能快地完成任务并没有错。mvFile::Copy

哎呀,有时在那些一次性任务中,Unix 实用程序是完成这项工作的正确工具,即使你知道如何在 Perl 中完成这项工作。

# 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 );
于 2012-11-27T20:36:30.997 回答
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 中轻松完成。不学习如何去做是你的决定,但我认为如果你经常这样做,它会让你的事情变得更容易。

于 2012-11-27T20:12:49.220 回答
0

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

将 Perl 视为一种脚本语言会牺牲可移植性、可维护性、执行速度和其他属性,以便在您在最短的时间内完成之前完成任务。做出这些牺牲的后果不是一成不变的,而是程序复杂性的一个函数。你的程序越复杂,你就越有可能在可维护性方面付出更多,而不是你在whipitupitude中获得的收益,并且你越有可能通过炮轰做出错误的选择。

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

有时,您会看到这种方法被嘲笑为“懒惰”。就是这样。当你的参数发生变化时,你是否考虑到上述情况并保持改变方法的意愿,决定了你是在从事好的懒惰还是坏的懒惰。真正懒惰的人知道,有时最懒惰的事情就是重新开始。

于 2012-11-28T02:08:41.017 回答