我希望用户输入文件名并让程序输出文件的内容。
我得到2x“未加引号的字符串可能与未来的保留字冲突”和“全局符号$ filename需要显式的包名。
use strict;
use warnings;
print 'Enter file name: ';
my $fileName = <STDIN>;
chomp($fileName);
open(fh, $filename or die $!);
另外,为什么文件处理不是一个变量(实际上取决于我看到它是变量的例子,就像我在这里有的那样)?
答案 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