#!/usr/bin/perl
use strict;
use warnings;
my $fileName = "fileName.txt";
if (-e $fileName) {
my $read = open($fileName);
print "File exists and has been read\n";
eval $read;
unlink $fileName;
}
else {
print "File does not yet exist\n";
}
这是我到目前为止所拥有的。此脚本的目标是检查文件是否存在,然后在文件存在时执行文件中的命令,但是每当我尝试运行此脚本时,我都会收到一条错误消息,说我无法使用字符串& #34; FILENAME.TXT"作为符号引用,但即使我在文件名中硬编码而不是将其设置为变量,我收到一条错误,指出$ fileName需要一个显式的包名。
答案 0 :(得分:5)
eval
您没有正确使用open
。 Open旨在创建文件句柄,但您仍需要从文件句柄中读取以加载内容。
以下文件像perlfaq5 - How can I read in an entire file all at once?
中建模的那样诋毁文件my $code = do {
open my $fh, '<', $fileName or die $!;
local $/;
<$fh>
};
或者,您可以使用File::Slurp
之类的模块:
use File::Slurp qw(read_file);
my $code = read_file($fileName);
然后你可以eval
像你原来那样加载代码:
eval $code;
do EXPR
另一方面,您可以执行外部perl代码,而无需使用do EXPR
加载文件的内容。您可以使用perldoc -f do
:
do EXPR
使用EXPR的值作为文件名,并以Perl脚本的形式执行文件的内容。
1. do 'stat.pl';
很像
1. eval `cat stat.pl`;
除了它更简洁,不运行外部进程,跟踪错误消息的当前文件名,搜索
@INC
目录,并在找到文件时更新%INC
。有关这些变量,请参阅@INC
in perlvar和%INC
in perlvar。它的不同之处在于,使用do
FILENAME评估的代码无法在封闭范围内看到词汇;eval
STRING。但是,它是相同的,因为它每次调用它时都会重新解析文件,因此您可能不希望在循环内执行此操作。
可以让你写do $fileName
。
(请注意,do EXPR
不与第一个代码示例中使用的do BLOCK
相同。)
do EXPR
有弱点;如果你告诉它,它将多次编译和执行同一个文件。快速而脏的脚本可以,但Perl提供的更安全,更强大的机制是modules,使用require和use加载(请注意require
如何更健壮的do FILE
版本,而use
就像是require
的包装器,它也会从模块中导入内容。)
答案 1 :(得分:2)
您正在正确打开电话。
此外,打开文件后,您需要阅读其中的行。
试试这个:
#!/usr/bin/perl
use strict;
use warnings;
use autodie;
my $fileName = "fileName.txt";
if (-e $fileName) {
open my $read, '<', $fileName;
local $/; # slurp mode;
my $data = <$read>;
close $read;
print "File exists and has been read\n";
eval $data;
unlink $fileName;
}
else {
print "File does not yet exist\n";
}