这在很大程度上取决于您想要完成的任务,以及是用户输入、本地功能还是远程功能。
我的意思是,一些参数 - 通过尝试使用它来“验证”要容易得多。例如,文件名 - 不要尝试手动捕获所有边缘情况,只需将其传递给open .... or die $!
有时,“默认并覆盖”更为明智。例如。:
my ( $first_thing, $second_thing ) = @_;
$first_thing //= "default value";
$second_thing //= 0;
注意——使用//
而不是||
- it's similar在使用中,但它测试只是未定义 - 而不是已定义但错误,例如''
or 0
.
有时您希望通过应用一组验证正则表达式来更好地进行验证。请注意,有些事情(例如电子邮件地址或 IP 地址)的彻底验证可能比您想象的要复杂得多,因此“是否存在参数”的简单边缘情况可以发挥作用。
当然,此时您也可以开始查看函数原型 https://perldoc.perl.org/perlsub.html#Prototypes。这与您可能想到的其他语言的原型完全不同:
#!/usr/bin/env perl
#says - must have a single scalar arg.
sub testfunction($) {
my ( $required_arg ) = @_;
print $required_arg;
}
testfunction(1);
testfunction;
后者将失败:
Not enough arguments for main::testfunction
注意 - Perl 原型检查type and number参数(例如,它是标量还是数组)。但不要检查值,并且can在传递数组时会产生一些意想不到的效果。
我建议传递哈希值非常适合默认机制,因为您可以:
#!/usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;
my %defaults = (
"test" => 1,
);
sub with_default {
my %args = (%defaults, @_);
print Dumper \%args;
}
with_default;
with_default(test => 4 );
但回到你原来的情况 - 如果你的函数在没有设置“值”的情况下根本无法工作,那么最好在代码中拼写出来:
if ( not defined $args -> {value}
or not $args -> {value} =~ m/^\w+$/ ) {
die 'value parameter must be supplied and match m/^\w+$/';
}
此时可能值得一提的是“污点”模式。它的一个特点是perl
这是您在许多其他语言中看不到的。
它特别告诉解释器“用户提供的”是“被污染的”,因此cannot无需验证即可使用。其中包括不安全的路径、环境变量等。
See perlsec https://perldoc.perl.org/perlsec.html#Taint-mode
But:
#!/usr/bin/env perl -T
use strict;
use warnings;
system "echo $ENV{'USERNAME'}";
会失败——因为system
不允许“受污染”的变量。 (但print
将要)。在删除“污点”之前,您需要将其通过验证步骤(例如,通常是正则表达式)。