【问题标题】:grep an array from other array in perl从perl中的其他数组中grep一个数组
【发布时间】:2014-01-31 19:28:30
【问题描述】:

我的 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

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

【问题讨论】:

    标签: arrays linux perl grep


    【解决方案1】:

    您没有删除换行符,因此您的匹配项在它正在寻找的内容中包含换行符。

    您还需要使 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 起什么作用呢?

    【讨论】:

    • 文件 idstatus 有多个元素,并且一些元素存在于 routename 中。例如。在 idstatus.txt 中有一个元素“strvtran online”,在 routename.txt 中有一个元素是“strvtran”。所以我想从 idstatus.txt grep“strvtran”并获取 idstatus.txt 的元素,如“strvtran online”......我使用了你的脚本,但它没有显示任何内容......跨度>
    • 那你没有使用我的脚本或者你的文件不是你说的那样?准确显示您运行的内容(编辑您的问题)
    【解决方案2】:

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

    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
    

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

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-23
      • 2017-10-13
      • 1970-01-01
      • 2011-04-07
      • 2012-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多