我正在为学校开展一个项目,这个课程非常缺乏描述性。我不明白发生了什么以及为什么我无法显示文件。
#!/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
答案 0 :(得分:3)
你只是让你的变量混淆了。您正在使用$FILE
和FILE
以及(无形)$_
。 $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}}