我的页面上有多个参数。现在我想从一个哈希数组中验证所有参数,它是否包含与我所拥有的参数中类似的数据。这两个条件要么数组已经具有value,如果它有值,它必须与param值匹配,如果值为空,则默认情况下它将返回true值。
帕拉姆
$validate_param->{email} = $saved_hash->{param}->{email};
$validate_param->{country_name} = $saved_hash->{param}->{country};
$validate_param->{city_name} = $saved_hash->{param}->{city_name};
$validate_param->{ht_name} = $saved_hash->{output}->{req}->{$args->{keynode}}->{Name};
$validate_param->{ht_rm} = $saved_hash->{param}->{room};
$validate_param->{ht_rt} = $saved_hash->{output}->{rating};
阵列
[{
'country_name' => 'AF|IN|AZ',
'ht_rm' => '1|2|3',
'ht_rt' => '2',
'city_name' => 'Kabul|Agra',
'ht_name' => 'Safi Landmark Hotel and Suites|SAFI LANDMARK HOTEL SUITES',
'email' => 'test@test.com|test2@test.com'
}]
请帮助我如何在不重复代码的情况下以优化的方式匹配数据。 Param将具有单个值,但在aaray中我们有多个值将被管道分隔。所以我必须检查数组是否包含param值
示例数据
$validate_param->{email} ="test2@test.com";
$validate_param->{country_name}="AF";
$validate_param->{city_name} ="Kabul";
$validate_param->{ht_name} ="Safi Landmark Hotel and Suites";
$validate_param->{ht_rm} ="2";
$validate_param->{ht_rt} ="3"
答案 0 :(得分:1)
看起来你需要验证功能; validate()
在通过所有规则时应返回true,
sub validate {
my ($input, $rules) = @_;
for my $key (keys %$rules) {
$input->{$key} =~ /$rules->{$key}/ or return;
}
return 1;
}
my $rules = [{
'country_name' => qr'^(AF|IN|AZ)\z',
'ht_rm' => qr'^[123]\z',
'ht_rt' => qr'^2\z',
'city_name' => qr'^(Kabul|Agra)\z',
'ht_name' => qr'^(Safi Landmark Hotel and Suites|SAFI LANDMARK HOTEL SUITES)\z',
'email' => qr'^(test\@test\.com|test2\@test\.com)\z',
}];
for my $rule (@$rules) {
print validate($validate_param, $rule) ? "ok\n" : "not ok\n";
}
这里,$rules
中的每个条目都是正则表达式,我们只是对传入的值运行Perl的正常正则表达式匹配。如果正则表达式匹配,则该字段有效。当然,必须注意创建真正符合预期的规则。
答案 1 :(得分:1)
将有效值列表从以管道分隔的列表转换为数组是最简单的。然后List::Util
模块中的any
函数将使检查非常简单。
从您的问题中不清楚有效值的数组是什么样的。你说它是一个哈希数组,但它在你的例子中只包含一个哈希。总是这样吗?我在此解决方案中使用了硬编码$validate_rules[0]
,因此它将始终使用数组中的第一个哈希来检查参数。这可能需要改变。
use strict;
use warnings;
use List::Util 'any';
my @validate_rules = (
{
country_name => 'AF|IN|AZ',
ht_rm => '1|2|3',
ht_rt => '2',
city_name => 'Kabul|Agra',
ht_name => 'Safi Landmark Hotel and Suites|SAFI LANDMARK HOTEL SUITES',
email => 'test@test.com|test2@test.com'
}
);
my $validate_param = {
email => 'test2@test.com',
country_name => 'AF',
city_name => 'Kabul',
ht_name => 'Safi Landmark Hotel and Suites',
ht_rm => '2',
ht_rt => '3',
};
# Change each string of valid values to an array
for my $entry ( @validate_rules ) {
$_ = [ split /\|/ ] for values %$entry;
}
while ( my ($key, $val) = each %$validate_param ) {
my $valid = any { $_ eq $val } @{ $validate_rules[0]{$key} };
printf qq{Key "%s" %s\n}, $key, $valid ? 'ok' : 'invalid';
}
<强>输出强>
Key "city_name" ok
Key "ht_name" ok
Key "ht_rm" ok
Key "country_name" ok
Key "email" ok
Key "ht_rt" invalid
工具已成功完成