无法从Perl哈希中删除键及其关联的值

kik*_*key 3 perl hash

我正在用perl编写一个基本的歌曲管理程序,该程序通过使用模块允许用户将歌曲名称和歌曲时间对添加到哈希中,其中键是歌曲的名称,值是播放时间歌曲,它们都是弦乐。addSong可以正常运行,但是removeSong不能正常运行。在removeSong中,我首先要检查传入的歌曲名称字符串是否作为键存在。如果输入与现有键匹配,则将其删除(以及其对应的值),如果不是,则子例程发出错误消息。当我通过删除歌曲“ Hello”继续测试该子例程时,我收到了我编写的错误消息,当输入与键不匹配并且使用Data时发出该错误消息:

我使用了这个stackoverflow链接来寻求帮助: 如何从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");
Run Code Online (Sandbox Code Playgroud)

这是我的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);
}
Run Code Online (Sandbox Code Playgroud)

GMB*_*GMB 6

这里:

sub removeSong{
    my $namesong=@_;
Run Code Online (Sandbox Code Playgroud)

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

你要:

my ($namesong) = @_;
Run Code Online (Sandbox Code Playgroud)

要么:

my $namesong = shift;
Run Code Online (Sandbox Code Playgroud)

参考:perldata

如果您在标量上下文中求值数组,则它将返回数组的长度。