2012-03-05 29 views
0

私はちょうどPerlで作業を始めました。私は初級レベルであり、ファイルハンドルを開くことに問題がありました。ここで ファイルハンドルを開いたときにエラーが発生しました

コードです:

#!/usr/bin/perl -w 

$proteinfilename = 'peptide'; 

open(PROTEINFILE, $proteinfilename) or die "Can't write to file '$proteinfilename' [$!]\n"; 

$protein = <PROTEINFILE>; 

close PROTEINFILE; 

print $protein; 

exit; 

私はプログラムを実行しようとしたたびに、それはあなたは私のエラー

readline() on closed filehandle PROTEINFILE at C:\BIN\protein.pl

または

Can't write to file 'peptide' [No such file or directory] 

をくださいすることができましたこれを理解するのを助けてください。私はファイル.txtとして保存し、protein.plと同じフォルダに保存しました。この仕事をするために他に何ができますか?

+1

"peptide"または "peptide.txt"というファイルはありますか?どのようにスクリプトを実行していますか?スクリプトの実行場所は、実行時の作業ディレクトリである必要はありません。 – geoffspear

答えて

4

あなたはのファイルを現在のディレクトリに開くように指示していますが、そのようなファイルはありません( "No such file or directory")。

おそらく現在のディレクトリは、ファイルが存在すると主張するディレクトリであるC:\BINではありません。ファイルを移動するか、絶対パスを使用するか、または現在のディレクトリを現在のディレクトリに変更して、アドレス指定することができます。

use Cwd  qw(realpath); 
use Path::File qw(file); 

chdir(file(realpath($0))->dir); 

おそらくファイル名はpeptideではありません。たとえば、実際にはpeptide.txtという名前が付けられます。 Windowsはデフォルトで認識される拡張機能を隠しますが、これは嫌いです。ファイルの名前を変更するか、正しいファイル名を使用して、この問題を解決できます。

1

ファイルを読み書きする予定ですか?あなたのopenステートメントは読むために開きます。あなたのエラーメッセージは「書く」と言います。 —のためにそれを使用して、あなたのエラーメッセージが混乱していると私は信じています。

「このようなファイルやディレクトリがありません」というエラーが表示された場合は、「ペプチド」という名前は現在のディレクトリ内のファイル名ではありません。 Perlはファイル名の拡張子をあなたのために追加しません。あなたのファイルが実際にpeptide.txt(それは 'txtファイル'であると言われているので)であれば、それはopenに指定する必要があります。 perl protein.plpeptide(またはpeptide.txt)が現在のディレクトリにある場合、問題が何であるかはわかりません。スクリプトがC:\BINディレクトリにあり、現在のディレクトリがC:\BINではなく、peptide(またはpeptide.txt)である場合はC:\BINになります。C:/bin/peptideまたはc:/bin/peptide.txtを開く必要があります。バックスラッシュからスラッシュへの切り替えに注意してください。バックスラッシュはエスケープ文字としてPerl固有の意味を持ち、Windowsはバックスラッシュの代わりにスラッシュを使用しています。あなたはバックスラッシュを使用しなければならない場合は、名前の周りに単一引用符を使用します。これは、コマンドライン引数からタンパク質ファイル名を取るために最も簡単かもしれ

my $proteinfilename = 'C:\BIN\peptide.txt'; 

。これにより、PATH上の任意の場所にスクリプトを置くことができる柔軟性と、どこでもファイルを選択できるようになります。あなたのPerlを助けるために


つの提案:これは単一を読み取っていること

open my $PROTEINFILE, '<', $proteinfilename or 
    die "Can't open file '$proteinfilename' for reading [$!]\n"; 

my $protein = <$PROTEINFILE>; 

close $PROTEINFILE; 

注:

  1. のように、openの3引数形式と字句ファイルハンドルを使用しますファイルからの行。ファイル全体を$proteinにスラップする必要がある場合は、もう少し作業をしなければなりません。そこのためにズルズル処理するためのモジュールがありますが、あなたは、単に使用することができます。

    my $protein; 
    { local $/; $protein = <$PROTEINFILE>; } 
    

    は、これは、1つの読み出し動作に丸呑みされたファイル全体を意味undefに行区切り文字を設定します。 $/変数はグローバルですが、最小値の範囲で値を調整します。 $proteinがslurp操作を含むブロックの外で宣言されていることに注意してください。

  2. use strict;および-wまたはuse warnings;を使用してください。時間が経つにつれて悲しみを救うでしょう。

私は20年間だけPerlを使用してきました。私は愚かなミスを発見する(とPerlは私のためにそれを行います)私の能力を信頼していないので、私は両方use strict;use warnings;のない深刻なスクリプトを書いていません。私はそのすべてを多くの間違いにするわけではありませんが、私はそれらを使うので、Perlは私を何度も救っています。ここで

+0

私はautorevending autovivvedハンドルが、querentの問題がどこにないのかを知りたい人はあまりいません。それは、実際のバグを修正することから、それが何であれ、気を散らす。 3つの引数を使用する場合、エンコーディングはどこですか? – tchrist

+0

助けてくれてありがとう、私は$ proteinfilenameとそれが働いたときにペプチドファイルにC:\ user \ BIN拡張を追加しました! – GeNeTiCstdent

1

どのようにあなたのプログラムは、あなたが以下のように末尾に(たとえば、.TXT用)ファイル拡張子を追加する必要が

#!/usr/bin/perl 
use strict; 
use warnings; 

my $proteinfilename = 'peptide.txt'; 

open(PROTEINFILE, $proteinfilename) or die "Can't write to file '$proteinfilename' [$!]\n"; 

my $protein = <PROTEINFILE>; 

close PROTEINFILE; 

print $protein; 

を移動します。

my $proteinfilename = 'peptide.txt'; 

あなたのプログラムがpeptide_test.pl言うと、入力されたテキストファイルpeptide.txtは同じディレクトリにある必要があります。
彼らは同じディレクトリにない場合は、以下のように絶対パスを使用します。

my $proteinfilename = 'C:\somedirectory\peptide.txt'; 

注:パスにバックスラッシュ\を無視し、絶対path.Thisの場合は、単一引用符を使用してください。あなたがdieステートメントを使用しない場合

は今のエラーについて、あなたはエラー

or die $! ;

あなたが得る、金型を使用した後にエラー

readline<> on closed filehandle PROTEINFILE at C:\BIN\protein.pl 

なりますNo such file or directory.

また、常に

use strict; 
use warnings; 

-wはperl 5.6後に廃止されました。この2行は/文はタイプミス、構文エラー

そして1以上を見つけるお手伝いをします、私はあなたが最後に、exit;を必要としないと思います。 Refer exit function.

+0

助けてくれてありがとう、あなたが言及したように働くプログラムを得た – GeNeTiCstdent

+0

GeNeTiCstdent - ようこそ。 –

関連する問題