我对此完全陌生,这应该是最简单的事情,但由于某种原因我无法打印本地文本文件。在尝试使用不同代码多次后,我开始使用以下代码,但它不会打印。
我已经在各种线程上搜索了几天来解决这个问题并且没有运气。请帮忙。这是我的代码:
#!/usr/bin/perl
$newfile = "file.txt";
open (FH, $newfile);
while ($file = <FH>) {
print $file;
}
我将代码更新为以下内容:
#!/user/bin/perl
use strict; # Always use strict
use warnings; # Always use warnings.
open(my $fh, "<", "file.txt") or die "unable to open file.txt: $!";
# Above we open file using 3 handle method
# or die die with error if unable to open it.
while (<$fh>) { # While in the file.
print $_; # Print each line
}
close $fh; # Close the file
system('C:\Users\RSS\file.txt');
它返回以下内容:我的第一个由perl生成的报告。我不知道这是从哪里来的。我没有在任何地方打印过#per;由perl生成的第一份报告。&#34 ;;声明,它绝对不在我的文本文件中。
我的文字文件中包含各种电子邮件,地址,电话号码和电子邮件摘要。
谢谢大家的帮助。我想出了我的问题。我以某种方式设法将自己从我的目录中踢出来并且没有意识到它。
答案 0 :(得分:1)
这很可能是打开文件失败和未能检查open
的返回值的组合。
如果您是perl的新手,我热烈建议您阅读优秀的“perlintro”手册页,在命令行上使用man perlintro
或perldoc perlintro
,或者查看此处:{{3 }}
“文件和I / O”部分提供了一种简洁明了的方法:
open(my $in, "<", "input.txt") or die "Can't open input.txt: $!";
while (<$in>) { # assigns each line in turn to $_
print "Just read in this line: $_";
}
如果在尝试打开文件时出现任何问题,此版本将为您提供解释并中止。例如,如果当前工作目录中没有名为file.txt
的文件,则您的版本将悄然无法打开该文件,之后它将无法从已关闭的文件句柄中读取。
此外,总是在perl脚本中添加至少一个这样可以为您节省很多麻烦:
use warnings; # or use the -w command line switch to turn warnings on globally
use diagnostics;
这些不会捕获打开文件的失败,但会在失败的读取时发出警报。
在这里的第一个示例中,您可以看到没有诊断模块,代码失败,没有任何错误消息。第二个示例显示了诊断模块如何更改此信息。
$ perl -le 'open FH, "nonexistent.txt"; while(<FH>){print "foo"}'
$ perl -le 'use diagnostics; open FH, "nonexistent.txt"; while(<FH>){print "foo"}'
readline() on closed filehandle FH at -e line 1 (#1)
(W closed) The filehandle you're reading from got itself closed sometime
before now. Check your control flow.
顺便说一下,传说中的“Camel Book”基本上是用于纸张打印的perl man页面,因此按perldoc perl
中列出的顺序读取perldoc将使您对语言的高度理解。一种合理的便宜和廉价的方式。
快乐的黑客攻击!
答案 1 :(得分:0)
这很简单,包括解释。
use strict; # Always use strict
use warnings; # Always use warnings.
open(my $fh, "<", "file.txt") or die "unable to open file.txt: $!";
# Above we open file using 3 handle method
# or die die with error if unable to open it.
while (<$fh>) { # While in the file.
print $_; # Print each line
}
close $fh; # Close the file
还有一种情况是您尝试打开的文件不在您认为的位置。因此,如果不是在同一个目录中,请考虑采用完整路径。
open(my $fh, "<", 'F:\Workdir\file.txt') or die "unable to open < input.txt: $!";
编辑:在您发表评论后,您似乎正在打开一个空文件。请在同一个脚本的底部添加它,然后重新运行。它将在C:\Users\RSS
中打开文件,并确保它确实包含数据?
system('C:\Users\RSS\file.txt');
答案 2 :(得分:-2)
首先,在您开始时,最好通过“使用警告”来启用所有警告。并禁用所有这样的表达式,这可能导致不确定的行为或难以通过编译指示调试&#39;使用严格的&#39;。
在处理文件流时,始终建议您检查是否能够打开流。所以,尝试使用croak或die都会使用给定的消息终止程序。
我建议检查文件结尾,而不是在while条件下读取。因此,找到了结束时的循环中断。通常,在读取一行时,您会将其用于进一步处理,因此最好使用chomp删除行尾。
用于读取perl文件的示例如下:
#!/user/bin/perl
use strict;
use warnings;
my $newfile = "file.txt";
open (my $fh, $newfile) or die "Could not open file '$newfile' $!";
while (!eof($fh))
{
my $line=<$fh>;
chomp($line);
print $line , "\n";
}