1

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

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

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

另外,为什么文件句柄不是变量(实际上取决于我是否看到它是变量的示例,就像我在这里所看到的一样)?

4

5 回答 5

5

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

于 2012-05-16T18:00:06.663 回答
4

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

fh应该my $fh

“全局符号 $filename 需要明确的包名。

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

于 2012-05-16T18:00:53.640 回答
4

你所有的问题都在这里(和$filenamevs. $fileName)。

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

你想要更多类似的东西

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

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

if (!$filename) { die $! }

但第二个更像:

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

尽管以这种方式 (with if (!open)) 这样做是没有意义的,除非您$fh使用更有用的范围声明——现在它只在if块内可见。

第二种情况隐含地涵盖了第一种情况,因为 if $filenameis undefinedopen()将失败并返回Use of uninitialized value $filename in open.

于 2012-05-16T18:01:50.503 回答
3

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

于 2012-05-16T18:19:54.957 回答
2

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

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

这里有一些有用的参考: http: //perldoc.perl.org/functions/open.html

于 2012-05-16T18:00:31.507 回答