许多初学者都会写这样的代码:
sub copy_file ($$) {
my $from = shift;
my $to = shift;
`cp $from $to`;
}
这很糟糕吗?为什么?应该使用反引号吗?如果是这样,怎么办?
有些人已经提到,您应该只在以下情况下使用反引号:
- 您需要捕获(或抑制)输出。
- 不存在内置函数或 Perl 模块来执行相同的任务,或者您有充分的理由不使用该模块或内置函数。
- 您清理您的输入。
- 你检查一下返回值。
不幸的是,像检查返回值这样的事情properly可能相当具有挑战性。它是否因信号而死亡?它是否运行完成,但返回一个有趣的退出状态?尝试解释的标准方法$?
太糟糕了。
我建议使用IPC::系统::简单 http://search.cpan.org/perldoc?IPC::System::Simple模块的capture()
and system()
函数而不是反引号。这capture()
函数的工作方式与反引号类似,不同之处在于:
- 如果命令未启动、被信号终止或返回意外的退出值,它会提供详细的诊断。
- 如果传递受污染的数据,它会提供详细的诊断。
- 它提供了一种简单的机制来指定可接受的退出值。
- 如果您愿意,它允许您在没有 shell 的情况下调用反引号。
- 它提供了避免 shell 的可靠机制,即使您使用单个参数也是如此。
与 Perl 的内置命令不同,这些命令还可以跨操作系统和 Perl 版本一致地工作system()
在旧版本的 Perl 上使用多个参数调用时(例如,使用多个参数的 5.6.0),它可能不会检查受污染的数据,或者在 Windows 下无论如何都可能调用 shell。
例如,以下代码片段将保存调用结果perldoc
转换为标量,避免 shell,如果找不到页面则抛出异常(因为 perldoc 返回 1)。
#!/usr/bin/perl -w
use strict;
use IPC::System::Simple qw(capture);
# Make sure we're called with command-line arguments.
@ARGV or die "Usage: $0 arguments\n";
my $documentation = capture('perldoc', @ARGV);
IPC::系统::简单 http://search.cpan.org/perldoc?IPC::System::Simple是纯 Perl,适用于 5.6.0 及更高版本,并且不具有 Perl 发行版通常不附带的任何依赖项。 (在 Windows 上,它依赖于 ActiveState 和 Strawberry Perl 附带的 Win32:: 模块)。
免责声明:我是以下内容的作者IPC::系统::简单 http://search.cpan.org/perldoc?IPC::System::Simple,所以我可能会表现出一些偏见。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)