gpt4 book ai didi

regex - Perl 脚本中的 Linux grep 命令不起作用

转载 作者:行者123 更新时间:2023-12-02 15:48:48 25 4
gpt4 key购买 nike

我有一个适用于 Linux 命令提示符的 grep 命令:grep -Po 'rand_num=\K[^ ]*' log.txt此命令在我的 log.txt 文件中打印 rand_num= 之后的数字。但是我需要在 perl 脚本中使用这个命令。我试过了

my $rand_number;
$rand_number = system("grep -Po 'rand_num=\K[^ ]*' log.txt");
print "Random number = $rand_number";

但它不起作用。我试过$rand_number = `grep -Po 'rand_num=\K[^ ]*' log.txt`;但这也没有用

谁能告诉我这里有什么错误以及它是如何工作的?

最佳答案

一旦在 Perl 脚本中,就无需到系统中运行外部命令(使用 Perl 的正则表达式!)——因为 Perl 可以做得非常好,而且做得更好。

这里有一些方法可以做到这一点。

打开一个文件并逐行读取,从每一行中获取所需的短语

open my $fh, '<', $file or die "Can't open $file: $!";

my @random_numbers;
while (<$fh>) {
push @random_numbers, /rand_num=(\S+)/g;
}
close $fh;
say for @random_numbers;

或者一次读取所有行并通过各种过滤器传递它们

open my $fh, '<', $file or die "Can't open $file: $!";

my @random_numbers = map { /rand_num=(\S+)/g } <$fh>;

close $fh;
say for @random_numbers;

我使用 map从每行中提取短语 grep将返回满足条件的整行。如果没有匹配项,则返回一个空列表,从map“消失”到整个返回列表中,或者如果没有任何匹配项,则进入未初始化的数组。这条路map充当过滤器。

以上捕获了所有rand_num=NUM 中的(假定)数字在每一行上,如果一行上可以有多个。如果还假定文件名$file以某种方式被读入脚本。

或者,使用“空”文件句柄(不需要文件名)

my @random_numbers;
while (<>) { ... } # same block as in first example

# OR

my @random_numbers = map { ... } <>; # same block as in second example

如果在命令行上使用该文件名调用脚本,script.pl file .

之所以有效,是因为“魔法”diamond operator ( <> ) 逐行读取在命令行上提交的文件。尽管所有这些——如果脚本运行为 script.pl file1 file2 ...它将通过所有这些文件执行上述操作。

也可以将整个文件读入一个字符串(“slurp”它)然后使用它。当感兴趣的模式跨越多行时,这很有用。让我们也使用一个库,在这里 Path::Tiny

use Path::Tiny;  # path()

my @rn = path($file)->slurp =~ /.../g; # same regex as before

现在正则表达式匹配为 bound slurp 返回的字符串方法,其中包含整个文件。由于它是在列表上下文中完成的,通过列表分配强加给正则表达式,所有匹配项都在列表中返回,该列表分配给 @rn .

我大胆假设您的(每个)脚本以

开头
use warnings;
use strict;

对于feature say我们还需要 use feature 'say';use包含它的 Perl 版本或包含它的另一个大型框架。


问题中的正则表达式匹配 rand_num= 之后的所有非空白字符.如果绝对确定(呵呵)这些只能是预期的数字,那就这样吧。

否则,人们可能会更加小心并使用仅匹配实际数字的模式。或者,如上捕获然后检查它确实是一个数字,使用 looks_like_number来自 Scalar::Util

关于regex - Perl 脚本中的 Linux grep 命令不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73262562/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com