将数组的相似元素分组在一起,以便在 Perl 中立即在 foreach 中使用

vik*_*kas 2 arrays perl hash foreach partition

我有一个数组,其中包含某些元素在某些条件下相似的元素(如果我们从数组元素中检测到“ np ”,则可以识别相似的元素)。我想在使用 foreach 语句时立即使用这些类似的元素。该数组如下所示

my @array = qw(abc_n abc_p gg_n gg_p munday_n_xy munday_p_xy soc_n soc_p);
Run Code Online (Sandbox Code Playgroud)

数组元素的顺序不必总是这样。

我正在再次编辑这个问题。抱歉,如果我无法正确提出问题。我必须使用上面数组中存在的变量在文件中多次打印字符串。我只是想让你通过下面的代码理解这个问题,下面的代码在任何意义上都是不正确的......我只是用它来让你理解我的问题。

open (FILE, ">" , "test.v");
foreach my $xy (@array){
print FILE "DUF A1 (.pin1($1), .pin2($2));" ; // $1 And $2 is just used to explain that 
}                                             // i just want to print abc_n and abc_p in one iteration of foreach loop and followed by other pairs in successive loops respectively
close (FILE);
Run Code Online (Sandbox Code Playgroud)

我要打印的结果如下:

DUF A1 ( .pin1(abc_n), .pin2(abc_p));
DUF A1 ( .pin1(gg_n),  .pin2(gg_p));
DUF A1 ( .pin1(munday_n_xy),  .pin2(munday_p_xy));
DUF A1 ( .pin1(soc_n),  .pin2(soc_p));
Run Code Online (Sandbox Code Playgroud)

使用的脚本语言是 perl 。非常感谢您的帮助。

谢谢。!!

zdi*_*dim 5

对数据集进行分区完全取决于数据“在某些条件下的相似程度”。

给出的条件是,随着删除_n_p“相似”元素变得相等(我假设下划线;OP说nand p)。在这种情况下可以做

use warnings;
use strict;
use feature 'say';
    
my @data = qw(abc_n abc_p gg_n gg_p munday_n_xy munday_p_xy soc_n soc_p);

my %part;

for my $elem (@data) { 
    push @{ $part{ $elem =~ s/_(?:n|p)//r } }, $elem;
}

say "$_ => @{$part{$_}}" for keys %part;
Run Code Online (Sandbox Code Playgroud)

分组的“相似”字符串作为演示打印,因为我不理解所显示输出的逻辑。请根据需要构建您的输出字符串。

如果就是这样,并且稍后在代码中不再需要处理任何输入,也不需要引用这些共同因素,那么您可能希望将组放在数组中

my @groups = values %part;
Run Code Online (Sandbox Code Playgroud)

如果需要,在写入数组时进行适当的排序sort { ... } values %part

对于更流畅和不太确定的“相似性”,请尝试“模糊匹配”;这是一个例子