打开文件句柄时出错

时间:2012-03-05 03:30:38

标签: perl filehandle

我刚开始使用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 放在同一文件夹中。我还能做些什么来完成这项工作?

3 个答案:

答案 0 :(得分:4)

你告诉perl在当前目录中打开文件peptide,但是在那里找不到这样的文件(“没有这样的文件或目录”)。

当前目录可能不是C:\BIN,即您声明文件所在的目录。您可以通过移动文件,使用绝对路径或更改文件来解决此问题 当前目录是teh脚本所在的目录。

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

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

也许该文件未命名为peptide。例如,它实际上可能被命名为peptide.txt。 Windows隐藏了默认识别的扩展程序,这是我讨厌的功能。您可以通过重命名文件或使用正确的文件名来解决此问题。

答案 1 :(得分:1)

您是否打算打开文件进行阅读或写作?您的open语句会将其打开以供阅读;您的错误消息显示为“正在写入”。你用它来阅读 - 所以你的错误信息令人困惑,我相信。

如果你得到'没有这样的文件或目录'错误,这意味着尽管你的想法,名称'肽'不是当前目录中文件的名称。 Perl不会为您添加文件名扩展名;如果您的文件实际上是peptide.txt(因为您提到它是'txt文件'),那么您需要指定open。如果您运行perl protein.pl并且peptide(或peptide.txt)位于当前目录中,则不清楚您的问题是什么。如果您的脚本位于C:\BIN目录中且​​当前目录不是C:\BINpeptide(或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,这意味着整个文件在一次读取操作中都会出现问题。 $/变量是全局变量,但这会在最小范围内调整其值。请注意,$protein在包含slurp操作的块之外声明!

  2. 使用use strict;以及-wuse warnings;。随着时间的推移,它会让你感到悲伤。

  3. 我只使用Perl已有20年了;我不会在没有use strict;use warnings;的情况下写一个严肃的剧本,因为我不相信我有能力发现愚蠢的错误(Perl会为我做这件事)。我没有犯过那么多错误,但Perl因为我使用它而多次救了我。

答案 2 :(得分: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';

注意:如果是绝对路径,请使用单引号。这将忽略路径中的反斜杠\

现在关于错误,如果你不使用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.