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)
我必须诚实.我认为无论是map
和grep
是够烦人的了解,如果你不熟悉的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
/ pop
和shift
/ unshift
作为添加和删除现有数组中元素的方法.