所以我是Perl程序员的开始。我已经使用它大约一个月了,但是只有在过去一周左右我才将它用于除sysadmin类型任务之外的任何其他任务。在这样做时,我遇到了以下问题,
Perl子进程非常灵活,它们不会对你传入的参数施加很多/任何约束。如何强制执行参数数量和/或检查它们是引用,标量等等?
澄清一下,这是我目前为Perl子进程做的事情:
sub mySub{
($a, $b) = @_;
continue and use these methods
}
但这并不能保证$a
和$b
持有什么。无论如何要确保它们包含值,例如$a
的引用和$b
的标量?
先谢谢。
编辑:当我说$b
的标量时,我的意思是包含一个整数,而不是对其他数据结构的引用。
答案 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