我刚开始使用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 放在同一文件夹中。我还能做些什么来完成这项工作?
答案 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:\BIN
但peptide
(或peptide.txt
)也位于C:\BIN
,那么您需要安排打开C:/bin/peptide
或c:/bin/peptide.txt
。请注意从反斜杠切换到斜杠。反斜杠具有特定于Perl作为转义字符的含义,Windows对斜杠代替反斜杠感到满意。如果必须使用反斜杠,则在名称周围使用单引号:
my $proteinfilename = 'C:\BIN\peptide.txt';
从命令行参数中获取蛋白质文件名可能是最简单的;这使您可以灵活地将PATH上的脚本放在任何位置,并将文件放在您选择的任何位置。
两个有助于Perl的建议:
使用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操作的块之外声明!
使用use strict;
以及-w
或use warnings;
。随着时间的推移,它会让你感到悲伤。
我只使用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.