【问题标题】:How to use Regex in a While If statement? Perl如何在 While If 语句中使用正则表达式? Perl
【发布时间】:2020-01-24 12:33:37
【问题描述】:

我是编程新手,但遇到了问题。我们必须使用 Perl 编写一个打开文件的脚本,然后使用正则表达式遍历每一行 - 然后打印出结果。我有文件的打开和循环,但我不知道如何实现正则表达式。当分配大纲建议数字为 338 时,它输出 0 个匹配结果。如果我不使用正则表达式,它会输出 2987,这是总行数 - 这是正确的。所以我无法弄清楚正则表达式有什么不正确的地方。任何帮助将不胜感激!

这是我目前所拥有的:

use warnings;
use strict;

my $i = 0;
my $filename = 'C:\Users\sample.log.txt';

open (fh, '<', $filename) or die $!;

while(<fh>) {
    if ($filename=~ /(sshd)/){
        $i++;
    }
}

close(fh);
print $i; 

【问题讨论】:

  • if ($filename=~ /(sshd)/) 应该是if (/sshd/)
  • 哇,谢谢!所以你不必在 perl 中使用正则表达式命令?我曾经尝试找到答案的每个资源都在正则表达式之后使用“=~”,这并不总是必要的?
  • 他不是这个意思。正则表达式匹配涉及两个运算符。 /foo/m/foo/ 的缩写,m// 运算符进行正则表达式匹配(与 s/// 进行替换或 tr/// 完全不与正则表达式有关)。与之协同工作的第二个运算符是=~,它将操作绑定到它将操作的字符串。如果没有绑定字符串,它将在$_ 上运行,如果你不将它分配给其他东西(但你应该),这也是 while() 分配的内容。

标签: regex perl


【解决方案1】:

考虑一下你的这段代码:

while(<fh>) {
    if ($filename=~ /(sshd)/){
        $i++;
    }
}

您确实在循环文件行,但您继续检查 文件名 是否与您的正则表达式匹配。这显然不是你想要的。

你的意思是:

while (my $line = <fh>) {
    if ($line =~ /sshd/){
        $i++;
    }
}

正则表达式周围的括号似乎是多余的(它们是要捕获的肉,而您只是匹配)。

由于表达式while (&lt;fh&gt;) 将行的内容分配给特殊变量$_(这是正则表达式匹配的默认参数),因此可以将其缩短为:

while (<fh>) {
    $i++ if /sshd/;
}

【讨论】:

  • 也可以使用perl -lne '$i++ if /sshd/ }{ print $i' C:\Users\sample.log.txt 或使用END{} 而不是爱斯基摩之吻。
  • 这相当于grep -c sshd C:\Users\sample.log.txt ...但我认为这个perl代码会增长。
  • @stevesliva:确实!但是 OP 似乎并没有在这里寻找单线,所以我提供了一个 perl 脚本的答案。
【解决方案2】:

OP 代码有一些错误,我已更正

use warnings;
use strict;
use feature 'say';

my $i = 0;
my $filename = 'C:\Users\sample.log.txt';

open my $fh, '<', $filename
        or die "Couldn't open $filename";

map{ $i++ if /sshd/ } <$fh>;

close($fh);

say "Found: $i";

【讨论】:

    猜你喜欢
    • 2015-12-24
    • 1970-01-01
    • 1970-01-01
    • 2012-04-30
    • 2018-06-21
    • 2011-08-21
    • 2022-10-24
    • 1970-01-01
    • 2019-11-28
    相关资源
    最近更新 更多