尝试使用Perl读取文本文件

时间:2012-05-16 17:58:07

标签: perl

我希望用户输入文件名并让程序输出文件的内容。

我得到2x“未加引号的字符串可能与未来的保留字冲突”和“全局符号$ filename需要显式的包名。

use strict;
use warnings;
print 'Enter file name: ';
my $fileName = <STDIN>;
chomp($fileName);
open(fh, $filename or die $!);

另外,为什么文件处理不是一个变量(实际上取决于我看到它是变量的例子,就像我在这里有的那样)?

5 个答案:

答案 0 :(得分:5)

$fileName$filename不同 - Perl区分大小写!

答案 1 :(得分:4)

您的所有问题都在这里(以及$filename$fileName)。

open(fh, $filename or die $!);

你想要更像

的东西
open (my $fh, '<', $filename) || die $!;

在第一种情况下,die条件位于$filename;它相当于:

if (!$filename) { die $! }

但第二个更像是:

if (!open (my $fh, '<', $filename)) { die $! }

虽然这样做(使用if (!open))这样做是没有意义的,除非你声明$fh具有更有用的范围 - 现在它只在if块中可见。

第二种情况隐含地涵盖了第一种情况,因为如果$filename未定义,open()将失败Use of uninitialized value $filename in open

答案 2 :(得分:3)

  

我得到2x“未加引号的字符串可能与未来的保留字冲突”和

fh应为my $fh

  

“全局符号$ filename需要显式包名。

$fileName$filename是不同的变量。第二个没有被宣布。

答案 3 :(得分:3)

您还问过为什么有时会看到裸字文件句柄(例如fh)与标量文件句柄(例如$fh)。前者已被弃用。使用声明的,但未定义的标量文件句柄使用“间接”文件句柄调用。 Perl为您自动生成(创建)对文件(句柄)的引用。最重要的是,一旦变量超出范围,并且没有其他引用,文件句柄就会自动关闭,Perl的垃圾收集可以收集使用的内存。

答案 4 :(得分:2)

您需要美元符号和正确的$fileName

open(my $fh, '<', $fileName) or die $!;

以下是一些有用的参考:http://perldoc.perl.org/functions/open.html