2016-05-21 13 views
0

私はperlを使い慣れていて、このプログラムを使ってmp3ファイルを使いこなしていましたが、うまくいかないようです。 だから私は私の音楽フォルダにこのファイルにアクセスし、それをプリントアウトしたいのですが、私はエラーを取得していたスクリプト実行している時はいつでも:私はそれはおそらく、基本的な何かを知っているが、私はできなかった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(); 
+0

あなたは、この行でエラー状態をチェックしていない: '$ mp3 = MP3 :: TAG->新しい(" C:\ Users \ユーザーplank223 \音楽\エリー・ゴールディング - ブライトライツ(デラックス・エディション) .mp3 ");'。エラーがある場合は$ mp3の値は何ですか?それは未定義ですか? – Bulrush

答えて

2

は、あなたのプログラムと間違って二つのことをあります。 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が失敗する理由です。 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; 
+0

答えをありがとうが、実際にはうまくいきませんでした。それを感謝します。 –

+1

@ハディーはちょうど_itが本当にうまくいっていないと言っていますが、あまり役に立ちません。それで、なぜ私は**それができなかったのか判断できません。代わりに、エラーメッセージを提供するか、プログラムの動作を説明する必要があります。 – simbabque

+0

本当に申し訳ありませんが、私はあなたの答えと他のものとの間をうんざりしました。あなたのアドバイスはうまくいき、コードは完璧に動いていましたありがとう、ありがとう、私は彼のコードが与えたエラーを他の人に書き込まなければならないでしょう。 –

1

あなたのコードは正しいと思われます。 あなたが試すことができます:使用する

私の推薦:

use strict; 
use warnings; 

テスト - >新しい():

データ:: Dumperを持つ$のmp3自体を見て
$mp3=MP3::Tag->new('file.mp3') or die "Can't open file $!"; 
#if it fails, it prints the message. $! is the error string. 

use Data::Dumper; 

print Dumper($mp3); 

もう少しお役に立てれば幸いです。あなたは、Windowsのパスに二重引用符"とバックスラッシュを使用している

+0

ええ、それは私がファイルを開くことができないことを伝え続けました、私は別のものを試して、他の男の答えを使用していくつかのものを修正し、それは働いた。答えをありがとう、それは私がコードの何が間違っているのを助けました。 –

関連する問題