我的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
我不想使用任何系统命令。请帮帮我
答案 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
仅用于引用名称中可能包含的任何元字符,例如.*^
等,因为它们会影响匹配。
希望这有帮助!