2012-03-05 145 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

該文件是「肽」還是「肽.txt」?你如何運行腳本?腳本的位置在運行時不需要工作目錄。 – geoffspear 2012-03-05 03:34:02

回答

4

您正在告訴perl在當前目錄中打開文件peptide,但它在那裏找不到這樣的文件(「沒有這樣的文件或目錄」)。

也許當前目錄不是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/peptidec:/bin/peptide.txt。請注意從反斜槓切換到斜槓。反斜槓具有特定於Perl的含義作爲轉義字符,而Windows則喜歡用反斜槓代替反斜槓。如果必須使用反斜槓,然後用單引號括起來的名稱:

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

這可能是最簡單的從一個命令行參數取蛋白文件名;這使您可以靈活地將PATH上的任何位置的腳本以及您選擇的文件放在任意位置。


兩個建議,以幫助你的Perl:

  1. 使用open和詞法文件句柄3個參數的形式,如:

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

    注意這讀取單個來自文件的行。如果你需要將整個文件寫入$protein,那麼你必須做更多的工作。有模塊來處理啜你,但你也可以簡單地使用:

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

    此設置行分隔符undef這意味着整個文件中的一個讀操作,咕嚕咕嚕。 $/變量是全局變量,但它在最小範圍內調整其值。請注意0​​在包含slurp操作的塊之外聲明!使用use strict;以及-wuse warnings;。隨着時間的推移,它會爲你解除痛苦。

我只用了20年的Perl;我不寫一個沒有use strict;use warnings;的嚴肅腳本,因爲我不相信我能夠發現愚蠢的錯誤(並且Perl會爲我做這件事)。我不會犯這麼多錯誤,但是Perl因爲使用它而多次救了我。

+0

我不太喜歡看到人們autorecommending autovivved句柄,當這不是querent的問題所在。它分散他們修理真正的bug,不管它是什麼。如果你打算使用三個參數,那麼編碼在哪裏? – tchrist 2012-03-05 13:54:58

+0

感謝您的幫助,在命名$ proteinfilename時,我在C:\ user \ BIN擴展名中添加了肽文件,它的工作原理! – GeNeTiCstdent 2012-03-06 02:43:42

1

這裏你的程序將如何去

#!/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; 

您需要在末尾添加文件擴展名(例如.txt)的象下面這樣。

my $proteinfilename = 'peptide.txt'; 

你的程序說peptide_test.pl和輸入文本文件peptide.txt應該是在同一個目錄。
如果它們不在同一個目錄中,請使用如下所示的絕對路徑。

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

注意:絕對path.This的情況下使用單引號將忽略反斜槓\路徑。

現在有關錯誤的,如果你不使用die語句,你會得到錯誤

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

使用模具後,

or die $! ;

你會得到錯誤No such file or directory.

還總是

use strict; 
use warnings; 

-w在perl 5.6後面棄用。這兩行/語句將幫助您找到拼寫錯誤,語法錯誤

還有一個,我不認爲你需要exit;在最後。 Refer exit function.

+0

感謝您的幫助,讓程序按照您提到的方式工作 – GeNeTiCstdent 2012-03-06 02:44:51

+0

GeNeTiCstdent - 歡迎。 – 2012-03-06 10:14:59