如何从文本文件中获取perl脚本来执行命令?

时间:2014-09-03 04:12:12

标签: perl printing

#!/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需要一个显式的包名。

2 个答案:

答案 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代码

另一方面,您可以执行外部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。但是,它是相同的,因为它每次调用它时都会重新解析文件,因此您可能不希望在循环内执行此操作。

         

    read more ...

  •   

可以让你写do $fileName

(请注意,do EXPR 与第一个代码示例中使用的do BLOCK相同。)

然而,

do EXPR有弱点;如果你告诉它,它将多次编译和执行同一个文件。快速而脏的脚本可以,但Perl提供的更安全,更强大的机制是modules,使用requireuse加载(请注意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";
}