Perl基本问题

Ara*_*rav 2 perl

  1. 在Unix shell脚本中,我们使用$?其中零等于成功的值来检查上一个命令的退出状态.我怎么能在Perl中做到这一点?

  2. 当我跑步时,perl -V我看到列出的一些路径@INC.如何添加新路径@INC

  3. 如何在GetOptions函数中设置参数的顺序?我想-email成为第一个参数,如果它作为第二个参数给出,它应该失败.

    GetOptions(
        'nemail' => sub {$ENV{EMAIL} = "Y"},
        'arg'    => \$help
    );
    
    Run Code Online (Sandbox Code Playgroud)
  4. 是什么扩展之间的区别.pl.pm?我什么时候需要使用.pm扩展程序?

  5. 当我写use File::Copy,代码在哪里?哪些环境变量可以use访问?

Sjo*_*erd 8

  1. 使用该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)
  2. 它的设计使得参数可以按随机顺序排列.你为什么要那样?有一个名为的配置设置require_order,但它并不完全是你想要的.

  3. .pl表示一个Perl库,最像是子程序的集合,可以通过它来包含require.这是十多年前的事了.Windows上的人也喜欢将此扩展提供给普通的Perl程序,因为操作系统是以扩展为中心的,并且对于没有扩展名的文件不能轻松工作.

    .pm表示Perl模块.模块只是一个遵循一些附加约定的库.这是来自Perl 5时代.

  4. File::Copy被转换为文件名File/Copy.pm,位于您的其中一个路径中@INC,有关详细信息,请参阅require.在我的系统上它会在/usr/lib/perl5,例如/usr/lib/perl5/5.10.0/File/Copy.pm.