perl表达&&和eq

时间:2013-03-14 12:08:50

标签: perl

我有一个Perl脚本,我可以在其中添加预过滤器。

if ($row->{'category'}  eq 'Software') { return undef; }

这可以按预期工作。

但如果我这样做

if ($row->{'category'}  eq 'Software' &&  $row->{'title'} =~ m/EDU|OLP|Molp|MOLP|Media/) { return undef; }

我无法让它发挥作用。我没有任何错误。

我花了最后一小时在线寻找解决方案,但我似乎无法找到它。

我也尝试过and而不是&&

这是Data::Dumper

$row输出
$VAR1 = {
      'manufacturer_model' => 'FQC-02310           ',
      'junk' => '42.03',
      'manufacturer' => 'Microsoft                     ',
      'model' => 'MSWIN81     ',
      'price' => '28.02',
      'title' => 'Win Pro SA EDU NL                       ',
      'category' => 'Software            ',
      'stock' => '251'
    };

4 个答案:

答案 0 :(得分:4)

问题在于:

$row->{'category'}  eq 'Software'

因为$ row-> {'category'}实际上是

'Software            '

考虑到这一点,这应该有效:

$row->{'category'} =~ /^Software\s*$/

答案 1 :(得分:3)

问题是您的哈希字段在文本值后面有尾随空格。如果要正确构建哈希,例如使用Text::CSV,则必须使用

处理收集的数据
s/\s+\z// for values %$row
在询问之前

。但是,如果虚假空白是CSV数据解码错误的结果,那么你应该修改它。

答案 2 :(得分:0)

$row->{'category'} = 'Software';
$row->{'title'} = 'Blank Media';
if (
    $row->{'category'}  eq 'Software'
    &&  $row->{'title'} =~ m/EDU|OLP|Molp|MOLP|Media/
) { print "OK!\n"; }

打印“OK!”在我看来,您的数据不是您所期望的(您在$row->{'title'}中遇到问题)。检查您的源数据,检查您的解析器。

答案 3 :(得分:-1)

如果您提供了您希望匹配但不匹配的示例数据,那将有所帮助。

修改
根据示例数据,我将您的正则表达式更改为:

$row->{'title'} =~ /(EDU|OLP|Molp|MOLP|Media)/i