从Perl哈希表中删除键及其相关值出现问题

4
我正在使用Perl编写一个基本的歌曲管理程序,通过使用模块,允许用户将歌曲名称和歌曲时间配对添加到散列表中,其中键是歌曲名称,值是歌曲时间,它们都是字符串。addSong功能完美运行,但removeSong却未如预期。在removeSong中,我首先想要检查传入的歌曲名字符串是否存在于散列表中。如果输入与现有的键匹配,则删除该键(以及相应的值),如果不匹配,子程序则会给出错误消息。当我试图通过删除歌曲"Hello"来测试子程序时,我收到了一个我预先设定的错误消息,显示输入与任何键都不匹配,并且当我在hash上使用Data::Dumper函数时,我可以看到我想要删除的歌曲键仍然存在于散列表中。
我使用了这个stackoverflow链接来获取帮助: How to remove keys from hash in Perl? 这是我test.pl函数的代码:
use warnings;
use FindBin;
use lib $FindBin::Bin;
use SongList;
use strict;

SongList::addSong("Hello", "5.23");
SongList::addSong("all my heros are cornballs", "3:23");
SongList::addSong("Grimy Waifu", "2:55");
SongList::addSong("ptsd", "2:28");
SongList::removeSong("Hello");

这是我SongList.pm模块的代码:

package SongList;
#DECLARE VARIABLES AS LOCALLY AS POSSIBLE TO PREVENT BUGS
use strict;
use warnings;
use Data::Dumper;
my %songhash;

my $songlisttitle;
sub addSong{#this works


    my ($namesong, $timesong) = @_;
    $songhash{$namesong}=$timesong;
    print "success\n";
    print Dumper(\%songhash);

}

sub removeSong{
    my $namesong=@_;

    print "removing song from list\n";
    if(exists $songhash{$namesong}){
    delete($songhash{$namesong})
    }
else{
    print "that song wasn't in the list anyways\n";
    }
    print Dumper(\%songhash);
}
1个回答

7
在这里:
sub removeSong{
    my $namesong=@_;

您正在将一个数组分配给一个标量变量。这将导致数组的长度被分配给标量(如果只传递了一个参数,则长度为1)。由于哈希中不存在键1,因此会出现错误消息。
您想要:
my ($namesong) = @_;

或者:

my $namesong = shift;

参考:perldata

如果您在标量上下文中评估数组,则返回数组的长度。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接