2014-09-02 39 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