grep来自perl中其他数组的数组

时间:2014-01-13 05:53:01

标签: arrays linux perl grep

我的perl中有两个数组 我想从其他数组grep一个数组我的perl代码如下。

#!/usr/bin/perl  
open (han5, "idstatus.txt");  
open (han4, "routename.txt");  
@array3 = <han4>; 
 @array4 = <han5>;  
foreach (@array3) { 
@out = grep(/$_/, @array4); 
print @out; }

文件routename.txt

strvtran
fake
globscr 

文件idstatus.txt

strvtran online   
strvtran online  
strvtran online
globscr online 
globscr online
globscr online  
globscr online  
globscr online 
Xtech dead  
Xtech dead  
fake online  
fake online  
fake connecting
walkover123 online  
walkover123 online

现在我想从idstatus.txt grep globscr 元素和输出应该是:

globscr online 
globscr online
globscr online  
globscr online  
globscr online

我不想使用任何系统命令。请帮帮我

2 个答案:

答案 0 :(得分:2)

您没有删除换行符,因此您的匹配项包含了换行符。

你还需要使for循环使用不同的变量,因为在grep中,$_只会引用当前正在检查的grep列表中的元素。

尝试:

chomp(@array3 = <han4>);
@array4 = <han5>;  
foreach my $routename (@array3) { 
    @out = grep(/$routename/, @array4); 
    print @out;
}

这将输出:

strvtran online   
strvtran online  
strvtran online
fake online  
fake online  
fake connecting
globscr online 
globscr online
globscr online  
globscr online  
globscr online 

我不确定你想要从idstatus.txt grep globscr是什么意思; routename.txt在什么角色扮演呢?

答案 1 :(得分:2)

不是grep ping每一行,而是考虑构建一个包含路由名称作为替换的正则表达式:

use strict;
use warnings;
use autodie;

open my $rnameFH, '<', 'routename.txt';
chomp( my @routename = <$rnameFH> );
close $rnameFH;

my $names = '(?:' . ( join '|', map { "\Q$_\E" } @routename ) . ')';
my $regex = qr /^$names/;

open my $idFH, '<', 'idstatus.txt';

while(<$idFH>){
    print if /$regex/;
}

close $idFH;

数据集输出:

strvtran online   
strvtran online  
strvtran online
globscr online 
globscr online
globscr online  
globscr online  
globscr online 
fake online  
fake online  
fake connecting

脚本创建一个OR类型的正则表达式,join路由名称为“|” (打印$names以查看此内容)。 map仅用于引用名称中可能包含的任何元字符,例如.*^等,因为它们会影响匹配。

希望这有帮助!