在Unix shell脚本中,我们使用$?
的值检查上一个命令的退出状态,其中零等于成功。我怎么能在Perl中做到这一点?
当我运行perl -V
时,我看到@INC
中列出了一些路径。如何向@INC
添加新路径?
如何在GetOptions
函数中设置参数的顺序?我希望-email
成为第一个参数,如果它作为第二个参数给出,它应该失败。
GetOptions(
'nemail' => sub {$ENV{EMAIL} = "Y"},
'arg' => \$help
);
扩展程序.pl
和.pm
之间有什么区别?我何时需要使用.pm
扩展程序?
当我写use File::Copy
时,代码位于何处? use
访问哪些环境变量?
答案 0 :(得分:8)
使用system
function启动外部命令,它还会设置child error variable $?
/$CHILD_ERROR
。不要自己进行这些检查,而是使用autodie
:
require IPC::System::Simple;
use autodie qw(:all);
system([0], 'foobar-command', '--option', '--yet-another-option');
# 0 is allowed as an exit status, others will throw an exception
内部编程结构,例如来自模块的子程序,使用超出shell编程知识的错误检查。有不止一种方法可以做到这一点。大多数类型,成功和失败都由函数的返回值表示,通常undef
表示失败,例如通过阅读documentation for File::Copy
,我们了解到失败的返回值为0,并且还设置了通常的其他错误变量。
use English qw($OS_ERROR)
use File::Copy qw(mv);
my $source = '/does_not_exist';
my $destination = '/tmp';
unless (mv($source, $destination)) {
warn "Move from $source to $destination failed: $OS_ERROR";
}
另一种可能性是例外。您必须详细了解这一点:PBP的第13章和EPP的第11章。
use Try::Tiny;
my $string;
try {
$string = Encode::decode('UTF-8', $octets_buffer, Encode::FB_CROAK)
} catch {
warn "Decoding failed: $_";
}
它的设计使得参数可以按随机顺序排列。你为什么要那样?有一个名为require_order
的配置设置,但它并不完全符合您的要求。
.pl
表示一个Perl库,大部分都是子程序的集合,可以通过require
包含在内。这是十多年前的事了。 Windows上的人也喜欢将此扩展名提供给普通的Perl程序,因为操作系统是以扩展为中心的,并且对于没有扩展名的文件不能轻松工作。
.pm
表示Perl module。模块只是一个遵循一些附加约定的库。这是来自Perl 5时代。
File::Copy
已转换为File/Copy.pm
中某个路径中的文件名@INC
,有关详细信息,请参阅require
。在我的系统上,它将位于/usr/lib/perl5
,例如/usr/lib/perl5/5.10.0/File/Copy.pm
。