无法访问 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;
我是 perl 的新手,一直在使用这个程序处理 mp3 文件,但它似乎不起作用。 所以我想访问我的音乐文件夹中的这个文件并将其打印出来,但是每当我 运行 脚本时,我都会收到错误消息:
Can't call method
get_tags
on anundefined
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;