使用Perl打开文件并预览其内容

时间:2015-07-03 17:38:36

标签: perl

我正在为学校开展一个项目,这个课程非常缺乏描述性。我不明白发生了什么以及为什么我无法显示文件。

#!/usr/bin/perl

use 5.010;
use strict;
use warnings;

print "\n+--------------------------+";
print "\n| The File Search &        |";
print "\n|         Display Tool     |";
print "\n+--------------------------+";

print "\nPlease enter the file you would like to read (with full path): \n";

my $FILE = <STDIN>;
chomp $FILE;
sleep 1;

open (FILE, "$FILE");
print "  Here is the secret information you seek supreme leader: \n";
print "==============================================================";

while ($FILE) {
    chomp $FILE;
    open $FILE;
}

我不完全确定我做错了什么。我尝试了各种不同的组合,但它只会导致错误。

更新

所以我根据每个人的建议对代码进行了一些修改(见下文)。运行脚本后,它返回以下错误

readline() on unopened filehandle at test.pl line 30.

在我下面的代码中,我认为我打开了文件句柄,但是这个错误让我觉得我在open命令附近的某个地方搞砸了。

#!/usr/bin/perl

use 5.010;
use strict;
use warnings;

print "\n+--------------------------+";
print "\n| The File Search &        |"; #Not so fancy banner! 
print "\n|         Display Tool     |"; 
print "\n+--------------------------+";

print "\n   Welcome to the Tool. It is still being tested!!\n";
print "\n    Please enter the file you would like to read: ";

my $filename = <STDIN>; #define the variable for the filename

if ( not -f $filename ) #This checks the validity of the file
{
print "Filename does not exist\n";
exit;
}

sleep 1;

print "  Here is the secret information you seek supreme leader: \n";
print "==============================================================\n";

open my $filehandle, "<", $filename; #or die $!

while ( <$filename> ) { #While loop to read each line of the file
    chomp;
    print "$_\n";
}

我注释掉了打开字符串的部分,因为它只是杀死了脚本,我想知道出了什么问题。我对“&lt;”有点困惑,就是在公开声明中。 @Borodin

3 个答案:

答案 0 :(得分:3)

你只是让你的变量混淆了。您正在使用$FILEFILE以及(无形)$_$FILE作为文件的名称开始,但您也从中读取chomp它和open它是错误的

您应该open文件名,文件句柄中读取,以及print您已阅读的内容(或任何其他值)。并且最好对所有局部变量使用小写,并为全局变量保留大写

您的代码应如下所示。我使用了 lexical 文件句柄$fh而不是旧式的全局句柄。将变量放在"$FILE"之类的引号中是错误的:充其量没有区别,但它可能会破坏您的程序。此外,<$fh>循环中的while会读入默认变量$_,这也是chomp的默认参数。可以把它想象成英语中的代词 it

open my $fh, '<', $file_name;
while ( <$fh> ) {
    chomp;
    print "$_\n";
}

答案 1 :(得分:2)

这里的核心问题是你重新开放,而不是实际阅读。

要打开文件:

open ( my $filehandle, "<", $filename ) or die $!;

die非常重要,因为它会告诉您打开文件是否有问题。 $!是状态码&#39;打开操作,所以它会告诉你文件是否找不到。

但是所有这样做是设置&#39; $filehandle为您提供接入点。

要获取文件的内容,您需要读取,并在perl中使用<>完成此操作。

所以:

my $line = <$filehandle>

会读一行。

如果您想要读取多行,则可以在while循环中执行。

while ( my $line = <$filehandle> ) {
    print $line;
}

您可能还会发现在执行此操作之前测试文件是否存在很有用:

if ( not -f $filename ) { 
   print "$filename does not exist\n";
   exit; 
}

答案 2 :(得分:1)

两个问题:一个是您使用STDIN运算符从<>读取$FILE的同一方式。二,假设您要显示while (<FILE>) { print; } 的内容,您的while循环应该看起来像

$_

这使用隐式变量FILE来存储每次通过循环从print读取的行,这是同一个变量while (my $line = <FILE>) { print "$line"; } 使用而没有其他参数。更明确地说,你可以写

chomp
不需要

print,因为while (<FILE>) { chomp; print "$_\n"; } 除非您告诉它,否则不会打印额外的换行符。你也可以写

while (my $line = <FILE>) {
    chomp $line;
    print "$line\n"
}

{{1}}