Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl哈希值为数组_Perl_Perl Hash - Fatal编程技术网

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;