bash命令的输出不存储在数组中

时间:2014-08-27 20:11:42

标签: arrays perl

我的下面的代码非常简单...我正在做的就是使用IP地址REGEX来搜索文件,找到与我的REGEX匹配的任何IP地址,我想将它们存储在@ array2中。

我知道我的REGEX有效,因为我已经在linux命令行上对它进行了测试,它完全符合我的要求,但当它集成到脚本中时,它只返回空白。应该有700个IP存储在数组中。

#!/usr/bin/perl
use warnings;
use strict;

my @array2 = `grep -Eo "\"\b[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\"" test1.txt`;
print @array2;

4 个答案:

答案 0 :(得分:3)

反引号``默认情况下表现得像双引号字符串。

因此你需要逃避反斜杠:

my @array2 = `grep -Eo "\\"\\b[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\"" test1.txt`;

或者,您可以使用单引号版本的qx来避免任何插值:

my @array2 = qx'grep -Eo "\"\b[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\"" test1.txt';

但是,我建议的方法是根本不用shell,而是在perl中执行此逻辑:

my @array2 = do {
    open my $fh, '<', 'test1.txt' or die "Can't open file: $!";
    grep /\b[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\b/, <$fh>;
};

答案 1 :(得分:2)

我真的不会混淆bash和perl。这只是在寻求痛苦。 Perl可以在本地完成所有工作。

类似的东西:

open (my $input_fh, "<", "test.txt" ) or die $!;
my @results = grep ( /\b[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/, <$input_fh> );

然而,这需要将文件压入内存,这不是最佳的 - 我通常使用while循环。

答案 2 :(得分:1)

反引号内的文字经过双引号替换。你需要加倍你的反斜杠。

无论如何,从Perl内部运行grep是可疑的;只是在文本文件中啜饮并使用Perl查找匹配项。

答案 3 :(得分:0)

从外部命令检索输出的最简单方法是使用open():

open(FH, 'grep -Eo \"\b[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\" test1.txt'."|")  
my @array2=<FH>;
close (FH);

..虽然我觉得Sobrique的想法是最好的答案。