gpt4 book ai didi

Perl:匹配一个数组元素然后将前一个(返回 5 个索引)数组元素复制到一个新数组

转载 作者:行者123 更新时间:2023-12-01 11:01:31 25 4
gpt4 key购买 nike

本质上,我想做的是搜索一个大文本文件,以识别每个显示“ no hits found ”,并将匹配标识符的内容复制到新列表中。我对这的第一部分没意见,但我似乎无法弄清楚的是如何将数组的元素精确地复制回 5 个索引(这是一个标识符)并将其复制到另一个数组。

我试过这样的,

$fastafile = 'HpHcTEST.txt';
open(FASTAFILE, $fastafile);
@seq = <FASTAFILE>;
my $fastaid;
foreach (@seq) {
if ($_ =~ /\*\*\*\*\* No hits found \*\*\*\*\*/){
$fastaid .= $_[-5];
}
}

print "here are the IDs\n";
print $fastaid;

有大量 [-5] 的变体,但没有一个起作用。我似乎找不到任何关于如何反向引用并在匹配时获得前一个元素的文档。有人知道如何为此编码吗?

非常感谢您的宝贵时间。

安德鲁

最佳答案

快速修复

一种方法是使用索引遍历 @seq

my @fastaid;

for (my $i = 0; $i < @seq; ++$i) {
if ($seq[$i] =~ /\*\*\*\*\* No hits found \*\*\*\*\*/){
push @fastaid, $seq[$i - 5] if $i >= 5;
}
}

请注意从标量到名为 @fastaid 的数组的更改,您可以使用它打印

print "Here are the IDs:\n";
print " - $_\n" for @fastaid;

甚至

print "Here are the IDs:\n",
map " - $_\n", @fastaid;

润色

作为brian d foy在下面的评论中注释,代码可以更优雅,更直接地表达意图。

my $id_offset = 5;
my @fastaid;

for ($id_offset .. $#seq) {
if ($seq[$_] =~ /\*\*\*\*\* No hits found \*\*\*\*\*/){
push @fastaid, $seq[$_ - $id_offset];
}
}

作为documented in the “Scalar Values” section of perldata , $#seq@seq 中最后一个元素的索引或。 .. range operator正确处理 @seq 长度小于 $id_offset 元素的情况。

显式的正则表达式绑定(bind)运算符仍然有点生硬。你可以去

my $id_offset = 5;
my @fastaid;

for my $i ($id_offset .. $#seq) {
for ($seq[$i]) {
push @fastaid, $seq[$i - $id_offset]
if /\*\*\*\*\* No hits found \*\*\*\*\*/;
}
}

或者如果您的版本至少为 5.10

use feature 'switch';

# ...

my $id_offset = 5;
my @fastaid;

for my $i ($id_offset .. $#seq) {
given ($seq[$i]) {
when (/\*\*\*\*\* No hits found \*\*\*\*\*/) {
push @fastaid, $seq[$i - $id_offset];
}
}
}

历史记录

过去,有人谈论重新利用 $# 来跟踪数组遍历的索引,这样您就可以编写

for (@fastaid) {
if (/\*\*\*\*\* No hits found \*\*\*\*\*/) {
push @fastaid, $seq[$# - 5] if $# >= 5;
}
}

但这从未实现。

关于Perl:匹配一个数组元素然后将前一个(返回 5 个索引)数组元素复制到一个新数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10305973/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com