【问题标题】:Perl command executing good when run on command line but not working in the Perl scriptPerl 命令在命令行上运行时执行良好,但在 Perl 脚本中不起作用
【发布时间】:2021-12-14 17:28:03
【问题描述】:

下面是我要执行的代码。我已经在代码中提到了第 266 行。我已添加该代码以删除日志文件中的空白行。我不确定我们是否可以在 Perl 脚本中运行 perl 命令。有没有其他方法可以运行它,以便我可以删除日志文件中的空白行?

以下是我在运行 Perl 脚本时遇到的错误:

syntax error at ./reportJBossErrors.pl line 266, near "n -e "
Execution of ./reportJBossErrors.pl aborted due to compilation errors.

这是部分代码,显示第 266 行:

sub main {
    readConfiguration($config_file);
    $short_hostname = `hostname | cut -f 1 -d.`;
    chomp $short_hostname;
    getFileandInstance($short_hostname);
    $yesterday = getYesterday();
    validateEnvironment();
    $log_file = getLogFile($FMASK,$yesterday);
    perl -i -n -e "print if /\S/" $log_file; # 266 line. This is where I'm getting the compilation error
    processFile($log_file);
    $html_out = writeEmail();
    sendEmail($CONFIG{"FROMADDR"},$CONFIG{"TOADDR"},"Normal",
    "JBOSS",$short_hostname,$log_file,$CONFIG{ENVTYPE},$html_out);
}

【问题讨论】:

    标签: perl


    【解决方案1】:

    您不能在 Perl 程序中调用 perl 命令,就好像它是 Perl 内置函数一样。您可以使用system 运行外部命令:

    my $cmd = 'perl -i -n -e "print if /\S/"';
    system "$cmd $log_file";
    

    您需要小心引用。由于您在 Perl 变量 $logfile 中有一个文件名/路径,并且您想要对其进行插值,因此它可以放在双引号内。由于您不想插入 \S,因此应该使用单引号。

    【讨论】:

      【解决方案2】:

      您不能在 Perl 程序中调用 perl 可执行文件,就像它是 Perl 内置函数一样。而是使用systemlist 形式运行外部命令。不要忘记检查命令是否成功:

      my @cmd = (perl => '-i', '-n', '-e', 'print if /\S/', $log_file);
      
      system(@cmd) == 0
          or die "system @cmd failed: $?";
      

      一般来说,我建议使用perl 的完整路径,而不是依赖$PATH

      另外,如果您需要跟踪状态等,请使用Capture::Tiny 获取您正在运行的命令的STDOUTSTDERR,以便记录错误信息。

      【讨论】:

      • 当我执行脚本时,出现以下错误。该文件位于正确的目录中。无法打开 server_pdbsdms1_bts1.log.2021-11-02:没有这样的文件或目录
      • 您需要1)确保脚本的工作目录是文件所在的目录;或 2) 将 $log_file 设置为目标文件的完整路径。
      • 文件在不同的路径。我选择了第二个选项,但仍然抛出同样的错误。我尝试使用完整路径对文件进行硬编码,但仍然出现相同的错误。
      猜你喜欢
      • 2015-05-12
      • 2018-03-25
      • 2015-11-12
      • 2013-06-17
      • 2012-03-29
      • 2015-11-28
      • 2013-07-18
      • 2019-03-23
      • 1970-01-01
      相关资源
      最近更新 更多