4

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

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

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

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

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

提前致谢。

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

4

4 回答 4

3

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

在你的情况下,像

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

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

于 2012-06-08T13:39:36.900 回答
1

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

有关完整说明,请参阅http://perldoc.perl.org/perlsub.html#Prototypes

sub 采用单个标量

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

sub 取两个标量

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

子取一个数组

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

子取哈希

sub quux (+%) {
    my $hashref = shift;
}
于 2012-06-08T15:16:39.087 回答
0

要检查 $a 是否是 ref,您可以使用

if(ref($a)) 

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

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

于 2012-06-08T13:38:08.747 回答
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
于 2012-06-08T13:45:04.250 回答