验证子进程的Perl参数

时间:2012-06-08 13:32:56

标签: perl subprocess

所以我是Perl程序员的开始。我已经使用它大约一个月了,但是只有在过去一周左右我才将它用于除sysadmin类型任务之外的任何其他任务。在这样做时,我遇到了以下问题,

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

澄清一下,这是我目前为Perl子进程做的事情:

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

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

先谢谢。

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

4 个答案:

答案 0 :(得分:3)

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

在你的情况下,像

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

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

答案 1 :(得分:1)

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

有关完整说明,请参阅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;
}

答案 2 :(得分:0)

要检查$ a是否为参考,您可以使用

if(ref($a)) 

要检查您可以使用的参考类型

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

答案 3 :(得分:0)

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

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