0

我有一个 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

4 回答 4

4

问题在这里:

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

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

'Software            '

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

$row->{'category'} =~ /^Software\s*$/
于 2013-03-14T12:41:18.163 回答
3

问题是您的哈希字段在文本值之后有尾随空格。如果您正在正确构建哈希,例如使用Text::CSV,那么您必须处理您收集的数据使用

s/\s+\z// for values %$row

在审问它之前。但是,如果虚假空白是 CSV 数据解码错误的结果,那么您应该改正它。

于 2013-03-14T12:41:57.770 回答
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'})。检查您的源数据,检查您的解析器。

于 2013-03-14T12:13:25.020 回答
-1

如果您提供了您期望匹配和不匹配的样本数据,那将有所帮助。

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

$row->{'title'} =~ /(EDU|OLP|Molp|MOLP|Media)/i
于 2013-03-14T12:13:06.923 回答