无法访问perl中的mp3文件

时间:2016-05-21 00:47:18

标签: perl mp3

我是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();

2 个答案:

答案 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);

我希望这会有所帮助!