【问题标题】:Verifying Perl Arguments to a Subprocesses验证子进程的 Perl 参数
【发布时间】:2012-06-08 13:32:56
【问题描述】:

所以我是一个初学者 Perl 程序员。我已经使用它大约一个月了,但是仅在上周左右,我才将它用于除了系统管理员类型的任务之外的任何事情。在这样做时,我遇到了以下问题,

Perl 子进程非常灵活,它们不会对传入的参数施加很多/任何限制。如何强制执行参数的数量和/或检查它们是否是引用、标量等?

为了澄清,这是我目前对 Perl 子进程所做的:

sub mySub{
    ($a, $b) = @_;
    continue and use these methods
 }

但这不能保证 $a$b 持有什么。无论如何要确保它们包含值,比如$a 的引用和$b 的标量?

提前致谢。

编辑:当我说$b 的标量时,我的意思是包含一个整数,而不是对其他数据结构的引用。

【问题讨论】:

标签: perl subprocess


【解决方案1】:

您可以使用Params::Validate 模块,它提供了检查参数列表的广泛可能性。

在你的情况下,像

validate_pos(@_, { type => HASHREF | ARRAYREF }, { type => SCALAR })

会这样做(请注意,“ref”没有单一类型)。当参数不匹配时它会死。

【讨论】:

【解决方案2】:

您应该能够使用子例程原型来指定它:

完整说明请参见http://perldoc.perl.org/perlsub.html#Prototypes

sub 采用单个标量

sub foo($) {
    my $scalar = shift;
}

sub 取两个标量

sub bar($$) {
    my ($scalar1, $scalar2) = @_;
}

sub 接受一个数组

sub baz (+*) {
    my $arrayref = shift;
}

sub 获取哈希

sub quux (+%) {
    my $hashref = shift;
}

【讨论】:

  • 这只是控制它们在作为运算符调用时的行为,当使用 () 调用时它不提供任何保证
【解决方案3】:

要检查 $a 是否是您可以使用的引用

if(ref($a)) 

要检查它是什么类型的参考,你可以使用

if (ref($a) eq "HASH") { #or ARRAY

【讨论】:

    【解决方案4】:

    您可以对参数执行测试以查看它们包含的内容。但是,检查标量是否为标量是没有意义的。

    sub mySub{
        my ($a, $b) = @_;
        if (ref $a eq 'ARRAY') { ... } # check for array ref
        continue and use these methods
     }
    

    $b 等变量已经是标量,只能包含标量值。例如,引用是一个标量值。因此,您需要更具体地说明您希望变量包含的内容。

    计算参数就像计算任何数组一样简单:

    sub foo {
        my $n_args = @_;  # array is scalar context returns its size
        if (@_ < 4) {     # same thing
        ...
    }
    

    为了验证例如字母数字字符串,您可以这样做

    if ($arg =~ /^[\w\s]+$/) {  # contains only whitespace and alphanumerics
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-04
      • 2017-10-02
      • 2015-07-06
      • 1970-01-01
      相关资源
      最近更新 更多