【问题标题】:How do I search one array for terms in another array and then put the results into a third array?如何在一个数组中搜索另一个数组中的术语,然后将结果放入第三个数组?
【发布时间】:2012-08-26 07:51:06
【问题描述】:

我有一个字符串数组@array,我想在@array2 中搜索@array 中的术语。 @array2 每行数据包含两个元素。

例如@array = a b c d

@array2 有两列包含行条目:

row1: a x,     
row2: y c,     
row3: d x,     
row4: d c,     
row5: x b,     
row6: x x,     
row7: y x

如果@array 的任何$member 在任何行中,我想将@array2 的那些行放入@array3 中,理想情况下全部放在一个列中,所以@array3 = a x y c d x d c x b

即第 6 行和第 7 行不包含 a、b、c 或 d,因此它们被排除在外! 任何帮助都会很棒!

【问题讨论】:

  • 您是否覆盖或附加了您放入字符串的文件?此外,您的问题越来越复杂,请展示一些示例输入以及您期望的结果。
  • 当然这取决于第二个文件的大小,但我至少会尝试将整个文件读入数组。查找这两个数组的相交元素会更简单很多 - 而且代码也更易于维护。 )
  • 我已经更新了问题描述 - 希望现在更容易阅读!
  • 如果你想问一个不同的问题,请开始一个新的线程,而不是完全改变一个旧的问题。

标签: arrays perl while-loop


【解决方案1】:

使用for 循环:

for my $member (@array) {
   ...
}

如果要耗尽数组,可以在while循环中使用shift

while (@array) {
    my $member = shift @array;
}

您甚至可以将其缩短为

while (defined(my $member = shift @array)) { ... }

但前提是您确定 @array 的所有成员都已定义。

【讨论】:

  • 使用您的最后一个建议,在我的第一个 while 循环中将 @array 分配给我使用的哈希:%members; while (defined(my $member = shift @array)) { if ($member =~ m/(\w+)/) { $members{$1} = 1; } } 但这似乎只有一个输出??
  • 我的下一个 while 循环是按原样搜索 @array2,或者在这种情况下作为文件搜索:open(FILE2, $filename2); while (my $member2 = <FILE2>) { if ($member2 =~ m/(\w+)/) { if (exists($members{$1})) { $member2 = <FILE2>; print $member; } } } close FILE2;
  • 当你说使用for循环时,你的意思是代替while循环吗?
【解决方案2】:

使用数组,for[each] 构造可能更合适

@array=<FILE>;  # in array context <FILE> returns an array instead a line

while(@array>0) {  # in scalar context @array returns the size of the array
    my $line = shift @array;
    ...
}

或保留数组

my $i=0;
while($i<@array) {
  my $line = $array[$i];
  ...
} continue {
  $i++
}

【讨论】:

    【解决方案3】:

    这是一种选择:

    use Modern::Perl;
    
    my @array  = qw/ a b c d /;
    my @array2 = ( 'a x', 'y c', 'd x', 'd c', 'x b', 'x x', 'y x' );
    my @array3;
    
    for (@array2) {
        my @i = split;
        push @array3, @i if $i[0] ~~ @array or $i[1] ~~ @array;
    }
    
    say for @array3;
    

    输出:

    a
    x
    y
    c
    d
    x
    d
    c
    x
    b
    

    for 循环遍历@array2 的元素,split将字母转换为@i。 'smart match' 操作符(Perl 5.10+)用于查看@array 中包含的列表中的一个或另一个字母,如果是,则@i 中的列表被推送到@array3,即终于打印出来了。

    【讨论】:

      猜你喜欢
      • 2019-05-07
      • 1970-01-01
      • 1970-01-01
      • 2016-04-03
      • 2021-04-01
      • 2013-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多