在Unix shell脚本中,我们使用$?其中零等于成功的值来检查上一个命令的退出状态.我怎么能在Perl中做到这一点?
当我跑步时,perl -V我看到列出的一些路径@INC.如何添加新路径@INC?
如何在GetOptions函数中设置参数的顺序?我想-email成为第一个参数,如果它作为第二个参数给出,它应该失败.
GetOptions(
'nemail' => sub {$ENV{EMAIL} = "Y"},
'arg' => \$help
);
Run Code Online (Sandbox Code Playgroud)是什么扩展之间的区别.pl和.pm?我什么时候需要使用.pm扩展程序?
当我写use File::Copy,代码在哪里?哪些环境变量可以use访问?
使用该system函数启动外部命令,它还设置子错误变量$?/$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
Run Code Online (Sandbox Code Playgroud)
内部编程构造,例如来自模块的子程序,使用的错误检查超出了您对shell编程的了解.有不止一种方法可以做到这一点.大多数类型,成功和失败都由函数的返回值发出信号,通常undef意味着失败,例如通过阅读文档,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";
}
Run Code Online (Sandbox Code Playgroud)
另一种可能性是例外.您必须详细了解这一点:PBP第13 章和EPP第11章.
use Try::Tiny;
my $string;
try {
$string = Encode::decode('UTF-8', $octets_buffer, Encode::FB_CROAK)
} catch {
warn "Decoding failed: $_";
}
Run Code Online (Sandbox Code Playgroud)它的设计使得参数可以按随机顺序排列.你为什么要那样?有一个名为的配置设置require_order,但它并不完全是你想要的.
.pl表示一个Perl库,最像是子程序的集合,可以通过它来包含require.这是十多年前的事了.Windows上的人也喜欢将此扩展提供给普通的Perl程序,因为操作系统是以扩展为中心的,并且对于没有扩展名的文件不能轻松工作.
.pm表示Perl模块.模块只是一个遵循一些附加约定的库.这是来自Perl 5时代.
File::Copy被转换为文件名File/Copy.pm,位于您的其中一个路径中@INC,有关详细信息,请参阅require.在我的系统上它会在/usr/lib/perl5,例如/usr/lib/perl5/5.10.0/File/Copy.pm.