use strict; use warnings; use Data::Dumper; my @genes = ( 'gi|Q384722390|emb|WP_938420210.1|Gene name', 'gi|342546780|emb|WP_934203412.1|Gene name', ); my @accession = ( 'WP_938420210.1', 'WP_934203412.1' ); my %genes = map { my @s = split /\|/, $_; ( $s[3] => [@s] ); } @genes; print Dumper \%genes; # list the 2nd field from each gene for (@accession) { print $genes{$_}[1], $/; }