验证Perl的参数给一个子进程(Verifying Perl Arguments to a Subp

2019-09-17 22:21发布

所以我一开始Perl程序员。 我一直在使用它了约一个月,但仅在过去一周左右我都已经使用了超过系统管理员类型任务的任何其他。 在此过程中我遇到了以下问题,

Perl的子进程是真正灵活,他们不会对你传递参数强加许多/任何限制。这怎么可能要么执行参数的数量和/或检查他们是否是引用,标量等等等等?

为了澄清,这是我目前对Perl子过程做到:

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

但是,这提供关于任何保证$a$b持有。 反正,以确保它们包含的值,譬如说一个参考$a和标量$b

提前致谢。

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

Answer 1:

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

在你的情况,像

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

会做(请注意,它不具备“参考”一单式)。 它死当参数不匹配。



Answer 2:

你应该能够说明这一点使用子程序原型:

见http://perldoc.perl.org/perlsub.html#Prototypes更全面的解释。

分取单个标

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

子取两个标量

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

子服用的阵列

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

子以哈希

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


Answer 3:

要检查$ a是否是一个参考,你可以使用

if(ref($a)) 

要检查它是什么类型的引用可以使用

如果(REF($ A)EQ “HASH”){#OR ARRAY



Answer 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


文章来源: Verifying Perl Arguments to a Subprocesses