使用perl打印文本文件

时间:2017-10-10 08:08:20

标签: perl printing

我对此完全陌生,这应该是最简单的事情,但由于某种原因我无法打印本地文本文件。在尝试使用不同代码多次后,我开始使用以下代码,但它不会打印。

我已经在各种线程上搜索了几天来解决这个问题并且没有运气。请帮忙。这是我的代码:

#!/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 ;;声明,它绝对不在我的文本文件中。

我的文字文件中包含各种电子邮件,地址,电话号码和电子邮件摘要。

谢谢大家的帮助。我想出了我的问题。我以某种方式设法将自己从我的目录中踢出来并且没有意识到它。

3 个答案:

答案 0 :(得分:1)

这很可能是打开文件失败和未能检查open的返回值的组合。

如果您是perl的新手,我热烈建议您阅读优秀的“perlintro”手册页,在命令行上使用man perlintroperldoc 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";
}