【问题标题】:perl equal strings comparison returns false even when they are equalperl 相等字符串比较即使它们相等也会返回 false
【发布时间】:2014-07-16 14:56:38
【问题描述】:

我有这个脚本,它的目标是比较 /var/adm/messages 并检查当前的最后一行是否等于检查的最新行。 问题是即使字符串相同,脚本仍然将它们视为不相等并继续执行 if 语句。 这是脚本:

#!/usr/bin/perl

use strict;
use warnings;

open (MESSAGES, "tail -1 /var/adm/messages |" ) || die "failed to open alarms file \n$!\n\a";
open (ERRORLOG, ">>/usr/local/bin/mcdl_errors.log") || die "failed to open errorlog file \n$!\n\a";

my $last_line = `cat /usr/local/bin/line.txt`;


while (my $this_line = <MESSAGES>) {

  chomp($this_line);

  if ($this_line =~ m/inet|hyena|root/i) {

    if ($this_line ne $last_line) {

      print "$this_line\n";
      print "$last_line\n";    
      `echo $this_line > /usr/local/bin/line.txt`;

    }    
  }
} 

close (MESSAGES);
close (ERRORLOG);

【问题讨论】:

  • 也许你需要在 $last_line 上大吃一顿?
  • 我尝试过 chomp 但没有帮助。似乎猫和回声之间存在差异
  • 从第一个 if 中取出第二个 if ?
  • 我很确定 perl 字符串比较有效。
  • 您使用的是 Windows 还是 Unix?如果您在 Windows 上工作,可能会出现行尾问题。您应该向我们展示您获得的示例输出。您应该在之前和之后打印带有标记字符的$this_line$last_line,以便您可以更轻松地分辨出其中的真正内容(例如print "this = [[$this_line]]\n";)。您应该考虑通过十六进制转储程序运行输出,以便检查字符串中的不可见(控制)字符。

标签: perl


【解决方案1】:

问题 1:正如有人已经指出的那样,您需要 chomp $last_line(回显将添加一个 \n)。

问题 2:在命令行上传递不带引号的字符串将导致 shell 对其进行解析,这可能会丢失由 shell 解释的字符(多个空格或制表符减少为一个空格,引号被删除等)。发生这种情况时,您下次读取的 last_line 将不再与日志中的行匹配。

问题 3:将不受信任的字符串传递给 shell 是一个非常糟糕的主意,因为攻击者很容易注入额外的命令来运行到字符串中,从而获得未经授权的访问。将日志字符串传递给未转义的 shell 是非常危险的。

总而言之,使用 perl 文件操作而不是 shell 来编写 line.txt 会好得多。

【讨论】:

  • 您好,感谢您的快速回答。如何通过 perl 将 this_line 传递给 line.txt 并从 line.txt 读取到 last_line?
  • @user2131714:考虑让 Perl 打开文件,将字符串写入文件,然后关闭文件。它不会比启动 shell 运行 echo 慢(因为最终运行 shell 以及打开文件、写入文件和关闭文件)。
  • 写入文件是 perl 中的一项简单任务,应该很容易从 perl 书籍或教程中获取任何示例并对其进行调整perlmaven.com/writing-to-files-with-perl
  • @Colin Phipps:感谢您的提示,我将脚本更改为仅使用 perl 进行读写。
猜你喜欢
  • 2011-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多