2014-09-02 71 views
1

我在我的页面上有多个参数。现在我想验证哈希数组中的所有参数,它是否包含与我有的参数类似的数据。将会出现2个条件,数组有值,如果它有值,它必须与参数值匹配,如果值的值为空,则默认情况下它将返回真值。在Perl中处理类似的检查

帕拉姆

$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'  => '[email protected]|[email protected]' 
}] 

请帮助我,我们怎么能不码重复匹配优化的方式的数据。 帕拉姆将具有单一的值,但在我们aaray具有多个值,这将是管seprated.So我要检查阵列中是否包含PARAM值或不

样本数据

$validate_param->{email} ="[email protected]"; 
$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

完成加入的$ validate_param,$ saved_hash和其它输入数据,以及如何结果应该看起来像这个问题的例子。 – 2014-09-02 11:24:42

+0

@mpapec更新了我的问题,请检查是否有任何数据匹配validate_param和数组,然后它将返回true否则它将返回false – Developer 2014-09-02 11:28:44

+0

@mpapec你得到了我正在寻找的问题? – Developer 2014-09-02 11:41:49

回答

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  => '[email protected]|[email protected]' 
    } 
); 

my $validate_param = { 
    email  => '[email protected]', 
    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 

工具成功

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的正常的正则表达式匹配。如果一个正则表达式匹配,领域已验证。当然,必须注意制定出真正符合他们所期望的规则。

+0

这对我来说很复杂,请详细解释一下,我无法理解这个 – Developer 2014-09-02 12:07:10

+0

$规则将会是多个哈希数组,然后我们将如何处理 – Developer 2014-09-02 12:16:06

+0

@Gaurav检查更新。不,这不会是真的。 https://eval.in/187186(https://eval.in/187187,以防万一) – 2014-09-02 12:56:22