Perl哈希值为数组
我有一个如下所示的输入文件:Perl哈希值为数组,perl,perl-hash,Perl,Perl Hash,我有一个如下所示的输入文件: start f1="apple" f2="banana" f3="berry" end start f1="guava" f2="banana" f3="berry" end start f1="apple" f2="cucumber" f3="orance" end 我计划创建一个以值为数组的散列 所有标记都将位于临时数组中,并且在标记之间有一个字段f1,其值将是散列的键 从开始到结束,它将存储在临时数组中,一旦到达结束,数组将作为哈希值推送,key作为最新字符
start
f1="apple"
f2="banana"
f3="berry"
end
start
f1="guava"
f2="banana"
f3="berry"
end
start
f1="apple"
f2="cucumber"
f3="orance"
end
我计划创建一个以值为数组的散列
所有标记都将位于临时数组中,并且在标记之间有一个字段f1
,其值将是散列的键
从开始到结束,它将存储在临时数组中,一旦到达结束,数组将作为哈希值推送,key作为最新字符串f1=
我已经编写了以下代码,但它不起作用
有人能在这里提出修改意见吗
#!/usr/bin/perl -w
use strict;
use Data::Dumper;
open( FILE, "<", "temp2" );
my %FILEDATA;
my @tmp = ();
my $fruit = "";
while ( <FILE> ) {
chomp( $_ );
push @tmp, $_;
my @linefields = split( '=', $_ );
if ( $linefields[0] =~ /f1/ ) {
$fruit = $linefields[1];
}
if ( $_ =~ /end/ ) {
if ( $fruit eq "apple" ) {
if ( exists $FILEDATA{"apple"} ) {
push( @{ $FILEDATA{"apple"} }, @tmp );
}
else {
$FILEDATA{"apple"} = @tmp;
}
}
elsif ( $fruit eq "guava" ) {
if ( exists $FILEDATA{"guava"} ) {
push( @{ $FILEDATA{"guava"} }, @tmp );
}
else {
$FILEDATA{"guava"} = @tmp;
}
}
undef @tmp;
}
}
print Dumper( \%FILEDATA );
#/usr/bin/perl-w
严格使用;
使用数据::转储程序;
打开(文件“请尝试此代码
my $file = 'fruits.txt';
my %hash;
open (my $fh, '<', $file) or die "Could not open $!";
while(my $line = <$fh>) {
next if $line =~ /start/;
next if $line =~ /end/;
if ($line =~ /f1/) {
my ($key, $val) = split /=/, $line;
push @{$hash{$key}}, $val;
}
if ($line =~ /f2/) {
my ($key, $val) = split /=/, $line;
push @{$hash{$key}}, $val;
}
if ($line =~ /f3/) {
my ($key, $val) = split /=/, $line;
push @{$hash{$key}}, $val;
}
}
print Dumper(\%hash);
my$file='fruits.txt';
我的%hash;
打开(我的$fh,我假设这是家庭作业
这里有一些指导方针
$
是许多Perl运算符的默认参数。特别是,chomp($\u)
可以写成chomp
,split('=',$\u)
应该是split/=/
,而if($\u=~/end/){…}
可以是if(/end/)
- 不需要测试
$fruit
的值。如果它的值是您想要的键,那么您应该使用$FILEDATA{$fruit}
$FILEDATA{“apple”}=@tmp
将$FILEDATA{“apple”}
设置为@tmp
中的元素数。您需要使用$FILEDATA{“apple”}=\@tmp
将其设置为对数组的引用
- 在使用
push
之前,无需检查哈希或数组元素是否存在。如果您只是push@{$FILEDATA{apple},'ff'
,则将创建数组
if($linefields[0]=~/f1/)
测试$linefields[0]
是否包含字符串f1
。要测试所需的相等性if($linefields[0]eq'f1')
- 不应使用
undef@data
或@data=undef
清空数组或哈希。正确的方法是@data=()
。要清空标量,请使用$val=undef
下面是代码的外观
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
open FILE, "<", "fruit.txt";
my %data;
my @tmp;
my $fruit;
while ( <FILE> ) {
chomp;
push @tmp, $_;
my @fields = split /=/;
if ( $fields[0] eq 'f1' ) {
$fruit = $fields[1];
}
if ( /end/ ) {
push @{ $data{$fruit} }, [ @tmp ];
@tmp = ();
}
}
print Dumper( \%data );
下面是我如何写的
#!/usr/bin/perl
use strict;
use warnings;
use autodie;
use Data::Dumper;
my $file = 'fruit.txt';
open my $fh, '<', $file
or die qq{Unable to open "$file": $!};
my ( %data, @block, $fruit );
while ( my $line = <$fh> ) {
chomp $line;
push @block, $line if @block or $line eq 'start';
$fruit = $1 if $line =~ /^f1="(\w+)"/;
if ( $line eq 'end' ) {
push @{ $data{$fruit} }, [ @block ];
@block = ();
$fruit = undef;
}
}
print Dumper \%data;
!/usr/bin/perl
严格使用;
使用警告;
使用自动模具;
使用数据::转储程序;
my$file='fruit.txt';
打开我的$fh,$FILEDATA{“apple”}=@tmp;
将@tmp
中的元素数分配给has元素。您不能将数组放入has中(仅标量),但可以将对arrayy的引用放入哈希中
#!/usr/bin/perl
use strict;
use warnings;
use autodie;
use Data::Dumper;
my $file = 'fruit.txt';
open my $fh, '<', $file
or die qq{Unable to open "$file": $!};
my ( %data, @block, $fruit );
while ( my $line = <$fh> ) {
chomp $line;
push @block, $line if @block or $line eq 'start';
$fruit = $1 if $line =~ /^f1="(\w+)"/;
if ( $line eq 'end' ) {
push @{ $data{$fruit} }, [ @block ];
@block = ();
$fruit = undef;
}
}
print Dumper \%data;