我是perl的新手,并且正在使用这个程序搞乱mp3文件,但它似乎不起作用。 所以我想在我的音乐文件夹中访问此文件并将其打印出来,但每当我运行该脚本时,我都会收到错误:
无法在第5行的
get_tags
值上调用方法undefined
。
我知道它可能是基本但我无法在谷歌上找到它。提前致谢
use 5.0.10;
#!/usr/bin/perl;
use MP3::Tag;
$mp3=MP3::Tag->new("C:\Users\plank223\Music\Ellie Goulding - Bright Lights (Deluxe Edition).mp3");
$mp3->get_tags();
if (exists $mp3->{ID3v1}) {
print "Filename: $filename\n";
print "Artist: " . $mp3->{ID3v1}->artist."\n";
print "Title: " . $mp3->{ID3v1}->title . "\n";
print "Album: " . $mp3->{ID3v1}->album . "\n";
print "Year: " . $mp3->{ID3v1}->year . "\n";
print "Genre: " . $mp3->{ID3v1}->genre . "\n";
} else {
print "Oi, no data here";
}
$mp3->close();
答案 0 :(得分:2)
您的计划有两个问题:
您在Windows路径中使用双引号"
和反斜杠。 Perl认为你试图用反斜杠\
来转义路径中的字符。如果您已阅读完整的错误消息,您会看到类似的内容。
无法识别的转义符\ m在F:\ scratch3.pl第10行传递。 无法识别的转义\ D在F:\ scratch3.pl第10行传递。 无法识别的转义\ D在F:\ scratch3.pl第10行传递。 无法识别的转义符\ D在F:\ scratch3.pl第10行传递。
那个Perl抱怨道路的逃逸部分。这些错误消息甚至在没有use strict
的情况下显示。 始终阅读完整的错误消息,而不仅仅是最底层的消息。
您可以通过简单地使用单引号'
而不是双引号"
来修复此问题。
这就是MP3::Tag->new
失败的原因。它将返回undef
,随后您将在未定义的值上调用get_tags
方法,如上一条错误消息所示。
之后,在循环内部,还有另一个错误。您正在使用未声明的$filename
。
您程序的工作版本可能如下所示。
use MP3::Tag;
use strict;
use warnings;
# single quotes here!
my $filename =
'C:\Users\plank223\Music\Ellie Goulding - Bright Lights (Deluxe Edition).mp3';
my $mp3 = MP3::Tag->new($filename);
$mp3->get_tags;
if ( exists $mp3->{ID3v1} ) {
print "Filename: $filename\n";
print "Artist: " . $mp3->{ID3v1}->artist . "\n";
print "Title: " . $mp3->{ID3v1}->title . "\n";
print "Album: " . $mp3->{ID3v1}->album . "\n";
print "Year: " . $mp3->{ID3v1}->year . "\n";
print "Genre: " . $mp3->{ID3v1}->genre . "\n";
}
else {
print "Oi, no data here";
}
$mp3->close;
答案 1 :(得分:1)
初看起来你的代码似乎是正确的。 你能尝试什么:
我建议使用:
use strict;
use warnings;
测试 - > new():
$mp3=MP3::Tag->new('file.mp3') or die "Can't open file $!";
#if it fails, it prints the message. $! is the error string.
使用Data :: Dumper查看$ mp3本身:
use Data::Dumper;
print Dumper($mp3);
我希望这会有所帮助!