如何忽略哈希表中的空格?

时间:2020-08-15 16:09:17

标签: string perl hash

当我运行代码的哈希表时,该表似乎考虑了空格(“: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}++;
        }
    }   
}

enter image description here

预先感谢您的回答

2 个答案:

答案 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}++;
}