在 perl 中比较一个字符串数组与另一个字符串数组

Sai*_*mma 0 arrays perl logic compare

我想将一个字符串数组与另一个字符串数组进行比较;如果匹配,则打印匹配。

例子:

@array = ("R-ID 1.0001", "RA-ID 61.02154", "TCA-ID 49.021456","RCID 61.02154","RB-ID 61.02154");
@var = ("TCA-ID 49", "R-ID 1");

for (my $x = 0; $x <= 4; $x++)
{
  $array[$x] =~ /(.+?)\./;
  if( ($var[0] eq $1) or ($var[1] eq $1) )
  {
    print "\n deleted rows are :@array\n";
  }
  else
  {
    print "printed rows are : @array \n";
    push(@Matrix, \@array);
  }
Run Code Online (Sandbox Code Playgroud)

然后我需要@var@array;进行比较 如果匹配,则打印匹配的模式。

这里,整个逻辑位于一个 hiartical for 循环中,它在每次迭代中给出一个新的 @array。所以每次执行这个逻辑时@array都有不同的字符串。

然后附带@var,它是用户输入字段,这个@var可以是任意大小。因此,为了根据这些约束运行逻辑,例如,当用户输入 @var 大小为 3 时,我需要迭代 if 循环内的条件。

因此,目标是使用上述逻辑来匹配和删除用户输入字符串。但不幸的是,逻辑不起作用。您能帮我解决这个问题吗?

tob*_*ink 5

内置grep关键字是一个很好的起点。

my $count = grep { $_ eq $var } @array;
Run Code Online (Sandbox Code Playgroud)

$_这将返回数组中等于 ( )的项目 ( eq)的计数$var

如果您需要不区分大小写的匹配,您可以使用lc(或在 Perl 5.16 或更高版本中,fc)来执行此操作:

my $count = grep { lc($_) eq lc($var) } @array;
Run Code Online (Sandbox Code Playgroud)

现在,它的一个缺点grep是它正在计算匹配数。因此,如果找到第一个匹配项,它将继续下去,直到数组末尾。您似乎不想这样做,而只是想知道数组中的任何项目是否匹配,在这种情况下,如果它是一个包含数千个元素的大数组,继续下去可能会比您需要的慢。

因此,请使用anyList::Util 模块(与 Perl 捆绑在一起)。

use List::Util qw( any );
my $matched = any { $_ eq $var } @array;
Run Code Online (Sandbox Code Playgroud)

一旦找到第一个匹配元素,它就会匹配,并跳过搜索数组的其余部分。