gpt4 book ai didi

perl - 迭代地在 Perl 中的匹配行之后抓取多行?

转载 作者:行者123 更新时间:2023-12-01 10:59:29 26 4
gpt4 key购买 nike

我想要一个散列结构,以 > 开头的每一行都是键,到下一个 > 的行是该键的值:

while (<DATA>) {
$line1 = $_;
chomp($line1);

if ($line1 =~ /^>/) {
while (<DATA>) {
last if $line1 =~ /^>/;
$value .= $_;
}
$hash{$line1} = $value;
}
}

foreach my $key(%hash) {
print "$key :$hash{$key}\n";
}

__DATA__
>label1
line1\n
line2\n
>label2
line1\n
line2\n

最佳答案

我认为使用具有外部作用域的键变量是最简单的方法:

代码

#!/usr/bin/env perl

use strict;
use warnings;
use feature 'say';

my $key = 'unlabeled';
my %value;

while (defined(my $line = <DATA>)) {
chomp $line;

# key line
if ($line =~ /^>(.*)/) {
$key = $1;
next;
}

# value line
push @{$value{$key}}, $line;
}

say "$_: " . join ', ' => @{$value{$_}} for keys %value;

__DATA__
>label1
line1
line2
>label2
line1
line2

输出

label1: line1, line2
label2: line1, line2

解释

我们将最后一次看到的哈希键保存在行迭代循环之外的变量 $key 中。当循环看到下一个关键行时,它会替换 $key 字符串。如果新键的数组不存在,perl 的 autovivification机制在哈希中创建一个新的空数组。如果 $key 下的散列中已有内容,则将在现有行之后添加新行。

编辑:如果您的输入不是以键行开头,则第一个非键行将添加到键未标记

编辑 2:如果您想要连接标签的行,可以通过 join "\n"=> @{$value{$_}} 轻松完成>。如果你想要那样你可以扔掉数组的东西并使用@perreal的解决方案,它非常相似但只是连接新行。

编辑 3:是的,自动复活! :)(感谢@TLP)

关于perl - 迭代地在 Perl 中的匹配行之后抓取多行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12511678/

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