无法访问 perl 中的 mp3 文件

Can't access an mp3 file in perl

我是 perl 的新手,一直在使用这个程序处理 mp3 文件,但它似乎不起作用。 所以我想访问我的音乐文件夹中的这个文件并将其打印出来,但是每当我 运行 脚本时,我都会收到错误消息:

Can't call method get_tags on an undefined value at line 5.

我知道它可能是一些基本的东西,但我在 google 上找不到它。提前致谢

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

乍一看,您的代码似乎是正确的。 你可以尝试什么:

我的使用建议:

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

希望对您有所帮助!

你的程序有两处错误:

您在 Windows 路径中使用了双引号 " 和反斜杠。 Perl 认为您正试图使用​​反斜杠 \ 转义路径中的字符。如果您阅读了完整的错误消息,您就会看到类似这样的内容。

Unrecognized escape \m passed through at F:\scratch3.pl line 10. Unrecognized escape \D passed through at F:\scratch3.pl line 10. Unrecognized escape \D passed through at F:\scratch3.pl line 10. Unrecognized escape \D passed through at F:\scratch3.pl line 10.

那是 Perl 抱怨路径的转义部分。这些错误消息甚至在没有 use strict 的情况下显示。 始终阅读完整的错误消息,而不仅仅是底部的

您可以通过简单地使用单引号 ' 而不是双引号 " 作为路径来解决这个问题。

这就是MP3::Tag->new失败的原因。它将 return 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;