Perl基本问题

时间:2010-06-25 06:00:20

标签: perl

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

  2. 当我运行perl -V时,我看到@INC中列出了一些路径。如何向@INC添加新路径?

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

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

  5. 当我写use File::Copy时,代码位于何处? use访问哪些环境变量?

1 个答案:

答案 0 :(得分:8)

  1. 使用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: $_";
    }
    
  2. 它的设计使得参数可以按随机顺序排列。你为什么要那样?有一个名为require_order的配置设置,但它并不完全符合您的要求。

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

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

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