在perl中处理类似的检查

在perl中处理类似的检查,perl,Perl,我的页面上有多个参数。现在我想验证散列数组中的所有参数,验证它是否包含与我的参数中类似的数据。将有两个条件,要么数组有值,如果它有值,它必须与参数值匹配,如果该值为空,则默认情况下它将返回真值 参数 $validate_param->{email} = $saved_hash->{param}->{email}; $validate_param->{country_name} = $saved_hash->{param}->{country};

我的页面上有多个参数。现在我想验证散列数组中的所有参数,验证它是否包含与我的参数中类似的数据。将有两个条件,要么数组有值,如果它有值,它必须与参数值匹配,如果该值为空,则默认情况下它将返回真值

参数

$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"

)

看起来您需要验证功能<代码>验证()通过所有规则时应返回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的普通正则表达式匹配。如果正则表达式匹配,则该字段有效。当然,必须注意创建真正只与它们应该匹配的规则。

最简单的方法是将有效值列表从管道分隔列表转换为数组。然后,模块中的
任何
功能将使检查非常简单

您的问题不清楚有效值的数组是什么样子的。您说它是一个散列数组,但在您的示例中它只包含一个散列。总是这样吗?我在此解决方案中硬编码了
$validate\u 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

工具成功完成

添加到问题示例$validate_param、$saved_hash和其他输入数据,以及结果应该是什么样子。@mpapec更新了我的问题。请检查validate_参数和数组中的任何数据是否匹配,然后返回true,否则返回false@mpapec你知道我要找的是什么吗?对我来说很复杂,请解释一下,我不明白这个$rules是什么数组的多个散列,那么我们将如何handle@Gaurav检查更新。不,这不是真的。(如有必要)