查找与第二个数组的元素匹配的数组元素

Gra*_*e90 3 arrays perl data-structures

我有两个数组@uarts@txd它看起来像这样

@uarts = qw(uart_1 uart_10 uart_3 uart_9 ); 
@txd = qw(PIO_uart_1 PIO_2_uart_1 PIO_uart_3 PIO_uart_10 PIO_uart_5 PIO_uart_9 PIO_uart_7);
Run Code Online (Sandbox Code Playgroud)

我想只提取那些@txd包含任何元素的元素 @uarts.我为它编写的代码如下,但不起作用.

my @array;
for (my $i = 0 ; $i <= $#uarts ; $i++) {
  @array = grep { $_ =~ /$uarts[$i]/ } (@txd);
  print "@array\n";
}
Run Code Online (Sandbox Code Playgroud)

Sob*_*que 5

我必须诚实.我认为无论是mapgrep是够烦人的了解,如果你不熟悉的Perl -避开.它们并没有获得太多 - 它们看起来像是在降低代码的复杂性,但那是因为grep的循环是隐含的.所以你所做的就是让你的代码更难以理解.

另外 - 我真的不喜欢for循环风格- 在perl中几乎总是多余的 - 在上面的例子中,你引用的唯一元素是当前的元素(如果你正在访问'next'或'previous',这是另一回事元件).

因此,展开它:

foreach my $uart ( @uarts ) {
    foreach my $PIO ( @txd ) {
        if ( $PIO =~ m/$uart/ ) { 
            print "$PIO matches $uart\n";
        }
     }
 }
Run Code Online (Sandbox Code Playgroud)

注意:这不会进行任何类型的唯一性测试,因此如果发生多个匹配,您将获得欺骗.

哦,打开use strict;use warnings;.你的数组声明是错误的.

my @uarts = qw ( uart_1 uart_10 uart_3 uart_9 );
my @txd   = qw ( PIO_uart_1 PIO_2_uart_1 PIO_uart_3 PIO_uart_10
                 PIO_uart_5 PIO_uart_9PIO_uart_7
);
Run Code Online (Sandbox Code Playgroud)

我也会指出 - 你已经@array在你的循环之外,这可能意味着想要保留它.但是你通过分配输出来破坏每次迭代grep.

我建议您@array在循环中使用范围,或者查看push/ popshift/ unshift作为添加和删除现有数组中元素的方法.

  • 如果你需要next/previous元素,那么像foreach my $ i(0 .. $#my_array)`这样的东西通常比传统的C-style for循环更容易阅读 (2认同)