perl从文本文件读取数据

ghhkc1vu  于 2023-03-03  发布在  Perl
关注(0)|答案(2)|浏览(191)

我想从一个输入文件中按顺序得到水果和信息(从第1行阅读并继续)。下面的代码以任意随机顺序打印水果和信息,每次运行脚本都会生成不同的顺序,而不是从第1行读取。有什么建议吗?
我有一个输入文件,如下所示

apple
    text1
    text2
grape
    text3
    text4
jackfruit
    text5

这是我必须调用每个水果和信息的代码

use strict;
use warnings;

my %hash;

open FILE, "config.txt" or die $!;
my $key;
while (my $line = <FILE>) {
     chomp($line);
     if ($line !~ /^\s/) {
        $key = $line;
        #$hash{$key} = [];
     } else {
        $line =~ s/\s//g;
        push (@{ $hash{$key} }, $line);
     }

 }
close FILE;

my %final;
foreach my $fruit (keys %hash){
   foreach my $info (values @{$hash{$fruit}}){

    print "Fruit: $fruit\n";
    print "Info for $fruit = $info\n";

}
}
mrphzbgm

mrphzbgm1#

keys %hash

给你一个来自哈希的键的数组,但是没有排序。你可以用命令sort排序它
整条线都是

foreach my $fruit (sort(keys %hash)){

使用perldoc -f sort获得排序函数的帮助。

nnsrf1az

nnsrf1az2#

如果你想按照文件中的顺序来保存数据,可以使用一个数组,数组中的每个元素都可以是一个散列来组织数据:

#!perl

use v5.26;

my @items;
while( <DATA> ) {
    chomp;

    if( /\A(\S+)/ ) {
        push @items, { fruit => $1, info => [] }
        }
    elsif( /\A\s+(.+)/ ) {
        push $items[-1]{info}->@*, $1
        }
    }

foreach my $item ( @items ) {
    print "Fruit: $item->{fruit}\n";
    foreach my $info ( $item->{info}->@* ) {
        print "\tInfo: $info\n";
        }
    }

__END__
apple
    text1
    text2
grape
    text3
    text4
jackfruit
    text5
cranberry
    text6

输出保持文件中的顺序:

Fruit: apple
    Info: text1
    Info: text2
Fruit: grape
    Info: text3
    Info: text4
Fruit: jackfruit
    Info: text5
Fruit: cranberry
    Info: text6

但是,如果您希望按照文件的顺序保存它们,并且只输出它们,则不需要数据结构:

my @items;
while( <DATA> ) {
    chomp;

    if( /\A(\S+)/ ) {
        print "Fruit: $1\n";
        }
    elsif( /\A\s+(.+)/ ) {
        print "\tInfo: $1\n";
        }
    }

如果您希望输出略有不同,其中每行都需要知道水果,请将该名称存储在while循环中的一个持久性变量中:

my @items;
while( <DATA> ) {
    state $fruit;
    chomp;

    if( /\A(\S+)/ ) {
        $fruit = $1;
        print "Fruit: $fruit\n";
        }
    elsif( /\A\s+(.+)/ ) {
        print "\t$fruit: $1\n";
        }
    }

相关问题