处理类似的perl检查

时间:2014-09-02 10:37:14

标签: perl

我的页面上有多个参数。现在我想从一个哈希数组中验证所有参数,它是否包含与我所拥有的参数中类似的数据。这两个条件要么数组已经具有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"

2 个答案:

答案 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

工具已成功完成