从perl哈希中删除密钥及其关联值时遇到问题



我正在用perl编写一个基本的歌曲管理程序,通过使用模块允许用户将歌曲名称和歌曲时间对添加到哈希中,其中键是歌曲的名称,值是歌曲的时间,它们都是字符串。addSong运行良好,但删除歌曲则不然。在 removeSong 中,我首先要检查传入的歌曲名称字符串是否作为键存在。如果输入与现有键匹配,则将其删除(以及相应的值(,如果不是,则子例程会发出错误消息。当我通过删除歌曲"Hello"继续测试子例程时,我收到我编程的错误消息,当输入与键不匹配时会发出该错误消息,当我在哈希上使用 Data::D umper 函数时,我可以看到我想删除的歌曲键仍在哈希中。

我使用了这个堆栈溢出链接寻求帮助: 如何在 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 "successn";
print Dumper(%songhash);
}
sub removeSong{
my $namesong=@_;
print "removing song from listn";
if(exists $songhash{$namesong}){
delete($songhash{$namesong})
}
else{
print "that song wasn't in the list anywaysn";
}
print Dumper(%songhash);
}

在这里:

sub removeSong{
my $namesong=@_;

您正在将数组分配给标量变量。这会导致数组的长度被分配给标量(如果按预期传递单个参数,这将1(。由于哈希中不存在密钥1,因此会收到错误消息。

你想要:

my ($namesong) = @_;

或:

my $namesong = shift;

参考资料: perldata:

如果在标量上下文中计算数组,它将返回数组的长度。

最新更新