2014-09-02 2 views
1

내 페이지에 여러 개의 매개 변수가 있습니다. 이제 해시 배열의 모든 매개 변수의 유효성을 검사하고 싶습니다. 매개 변수가있는 매개 변수와 유사한 데이터가 있는지 여부를 확인해야합니다. 배열에 값이있는 경우 값이 있으면 매개 변수 값과 일치해야합니다. 값 값이 비어 있으면 기본적으로 true 값을 반환합니다.비슷한 체크를 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

완료. –

+0

@mpapec 업데이트 된 내 질문 validate_param 및 배열에서 일치하는 데이터가 있는지 확인한 다음 true를 반환합니다 그렇지 않으면 false를 반환합니다 – Developer

+0

@mpapec 내가 뭘 찾고있어 문제가있어 ?? – Developer

답변

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 

도구 $ validate_param, $ saved_hash 및 기타 입력 데이터, 어떻게 결과가 같아야의 질문의 예에 추가 성공적으로

1

확인 기능이 필요한 것 같습니다. 이 모든 규칙을 통과 할 때 validate() 여기

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의 각 항목은 정규 표현식이며, true를 돌려, 우리는 단순히 전달 값에 펄의 일반 정규 표현식 매칭을 실행합니다. 정규식과 일치하는 경우, 현장 유효합니다. 물론 실제로 필요한 규칙과 일치하는 규칙을 만드는 데주의를 기울여야합니다.

+0

그것은 나를 위해 매우 복잡합니다 조금 설명해주세요. 이걸 이해할 수 없네요. – Developer

+0

$ 규칙은 여러 해시의 배열이 될거예요. 어떻게 처리할까요? – Developer

+0

@Gaurav 확인 업데이트. 아닙니다. 사실이 아닙니다. https://eval.in/187186 (도움이 필요하면 https://eval.in/187187) –