你的代码“运行”起来了。你应该总是说清楚你所谓的“不工作”的含义。
我认为的问题是,你的代码正好按照你描述的方式工作。它找到了“那些包含
@uarts
中任意元素的
@txd
元素”,而我认为你需要的是以
@uarts
中任意字符串结尾的那些元素。
按照现有的形式,你的程序输出:
PIO_uart_1 PIO_2_uart_1 PIO_uart_10
PIO_uart_10
PIO_uart_3
PIO_uart_9
因为uart_1
是PIO_uart_10
的一个子字符串,所以在查找时会找到后者。如果要查找以给定uart字符串结尾的元素,只需将正则表达式添加一个行尾锚点即可,如下:
@array = grep { $_ =~ /$uarts[$i]$/ } (@txd)
这将改变输出结果为:
PIO_uart_1 PIO_2_uart_1
PIO_uart_10
PIO_uart_3
PIO_uart_9
我希望这正是您所需要的内容。
但是它可以写得更好。最好循环遍历数组的内容,除非您特别需要索引,而且没有必要将@array
作为全局变量(它的命名也可以更好),因此这将适用于您。
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_9 PIO_uart_7);
for my $uart ( @uarts ) {
my @matches = grep /$uart\z/, @txd;
print "@matches\n";
}
输出
PIO_uart_1 PIO_2_uart_1
PIO_uart_10
PIO_uart_3
PIO_uart_9
for
之后看到一个空格来区分它和函数调用也会很好。请参考perldoc perlstyle了解最常见的标准。 - Borodin