当我运行代码的哈希表时,该表似乎考虑了空格(“:405%”)。我们该如何过滤?我尝试使用if条件执行此操作,但它似乎不起作用。
my @g = ();
foreach my $e (@genres){
my $genre = $e->as_text;
@g = split(/[à| ]/,$genre);
foreach my $e2 (@g){
if ($e2 ne ("Genres:" or ' ') ) {
$index{$e2}++;
}
}
}
预先感谢您的回答
答案 0 :(得分:1)
正如肖恩在评论中指出的那样,这与您的想法不符:
if ($e2 ne ("Genres:" or ' ') ) {
ne
对两个标量值进行运算。 Perl首先评估or
表达式:'Genres:'
为真,因此('Genres:' or ' ')
产生'Genres:'
。条件过滤掉值为'Genres:'
的键,但忽略' '
。
您需要使用ne
重复and
表达式:
if ($e2 ne 'Genres:' and $e2 ne ' ') ) {
答案 1 :(得分:1)
@g = split(/[à| ]/,$genre); foreach my $e2 (@g){ if ($e2 ne ("Genres:" or ' ') ) { $index{$e2}++; } }
很多这样很奇怪。让我们一次看看它。
@g = split(/[à| ]/,$genre);
我不确定您为什么在[à| ]
上分裂。特别是,我在您的数据中看不到任何'à'实例。通过在空间上进行拆分,您将获得一个包含三个元素的数组-第一个是流派,第二个始终是冒号,第三个是百分比。
foreach my $e2 (@g){
现在您要遍历阵列。但是我认为您只对流派感兴趣,流派是数组的第一个元素。那为什么还要看另外两个呢?
if ($e2 ne ("Genres:" or ' ') ) {
这根本不符合您的想法。您一次只能与一个值进行比较。所以这应该是:
if ($e2 ne 'Genres:' and $e2 ne ' ') {
而且,即使那样,第一个表达式也永远不会匹配,因为您的流派字符串都不是“ Genre”,也不包含冒号(除了我们前面说过的,@g
中的第二个元素仅包含一个冒号。
我认为您真正想要的是:
my ($genre_name, $percent) = split(/ : /, $genre);
if ($genre_name ne 'Genres' and $genre_name ne ' ') {
$index{$e2}++;
}