2013-03-14 92 views
0

我有一个Perl脚本,可以在其中添加预筛选器。perl表达式&&和eq

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

这个按预期工作。

但如果我这样做

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

我无法得到它的工作。我没有得到任何错误。

我花了最后一小时在线寻找解决方案,但我似乎无法找到它。我也试过and而不是&&

这是如果你提供你所期望的匹配和不匹配什么样的数据,这将帮助$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

你可以显示'Data :: Dumper'对'$ row'的看法吗? – choroba 2013-03-14 12:12:11

+0

我已经添加了翻车机的输出.. – naf 2013-03-14 12:35:01

+3

显然,正如我在评论中所说的那样,'category'字段在文本后面有多个空格。你正在错误地填充结构。请显示生成此散列的代码。 – Borodin 2013-03-14 12:38:21

回答

4

的问题是在这里:

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

因为$行 - > { '类'}实际上是

'Software   ' 

考虑到这一点,这应该工作:

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

这工作。看起来像软件后的空间是原因。谢谢你的帮助。 – naf 2013-03-14 12:59:10

-1

Data::Dumper输出。

编辑
根据样本数据,我想你的正则表达式更改为: “OK!”

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

我正在使用csv文件..与字段。 – naf 2013-03-14 12:13:57

+0

我希望从csv文件中获取样本数据。关于您的正则表达式,请尝试m /(EDU | OLP | Molp | MOLP | Media)/ – whoopes 2013-03-14 12:22:34

+0

这里是一个示例数据..“Software”,“MSWIN81”,“Win Pro SA EDU NL”,“FQC-02310” ,“Microsoft”,28.02,42.03,251 – naf 2013-03-14 12:23:59

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

,打印它看起来像你的数据是不是你所期望的(你在$row->{'title'}有问题)。检查你的源数据,检查你的解析器。

+0

这是一个样本行。 “软件”, “MSWIN81”, “运临SA EDU NL”, “FQC-02310”, “微软”,28.02,42.03,251标题是第三一个.. – naf 2013-03-14 12:23:32

+1

那么问题是'Software'后面有一个空格,所以类别不等于''Software'' – Borodin 2013-03-14 12:28:16

+1

@naf这并不能解决问题,因为它不是'$ row'中的内容,它就是你*认为*在'$ row'中。使用Data :: Dumper和*可以精确地显示'$ row'中的内容,并且/或者显示将输入放入'$ row'的代码。 – TLP 2013-03-14 12:28:28

3

问题是你的散列字段在文本值之后有空格。如果您是使用Text::CSV建立正确的散列,例如,那么你必须使用

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

询问之前处理您所收集的数据。但是,如果虚假空白是CSV数据的错误解码的结果,那么您应该修复该问题。