gpt4 book ai didi

function - 如何验证 Perl 中的函数参数?

转载 作者:行者123 更新时间:2023-12-03 06:34:23 26 4
gpt4 key购买 nike

您能告诉我在 Perl 中验证函数参数最明智的方法是什么吗?

代码片段:

sub testfunction {
my ($args) = @_;
my $value = $args->{value} || die "no value set";
# process value ...
}


testfunction({value => 'Hallo'});

testfunction({novalue => 'Hallo'});

上述方法是在 perl 中验证函数参数的良好替代方法还是有更聪明的方法?非常感谢大家。

最佳答案

这在很大程度上取决于您想要完成的任务,以及是用户输入、本地函数还是远程函数。

我的意思是,一些参数 - 通过尝试使用它来“验证”要容易得多。例如,文件名 - 不要尝试手动捕获所有边缘情况,只需将其传递给 open .... or die $!

有时 - “默认并覆盖”更明智。例如:

my ( $first_thing, $second_thing ) = @_; 
$first_thing //= "default value";
$second_thing //= 0;

注意 - 使用 // 而不是 || - 它的用法类似,但它只是测试未定义 - 而不是已定义但错误,例如 ''0

有时您希望通过应用一组验证正则表达式来更好地进行验证。请注意,有些事情(例如电子邮件地址或 IP 地址)的彻底验证可能比您想象的要复杂得多,因此“是否存在参数”的简单边缘情况可以发挥作用。

当然,此时您也可以开始查看 function prototypes 。这与您可能想到的其他语言的原型(prototype)完全不同:

#!/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 原型(prototype)检查参数的类型数量(例如,它是标量还是数组)。但不要检查值,并且在传递数组时可能会产生一些意想不到的效果。

我建议传递哈希值非常适合默认机制,因为您可以:

#!/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 的一项功能,在许多其他语言中都看不到。

它特别告诉解释器“用户提供的”是“受污染的”,因此未经验证就无法使用。其中包括不安全的路径、环境变量等。

参见perlsec

但是:

#!/usr/bin/env perl -T
use strict;
use warnings;

system "echo $ENV{'USERNAME'}";

将会失败 - 因为系统不允许“受污染”的变量。 (但是 print 会)。在删除“污点”之前,您需要将其通过验证步骤(例如,通常是正则表达式)。

关于function - 如何验证 Perl 中的函数参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44065722/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com