簡體   English   中英

如何使用 perl 遍歷 object 中的哈希數組

[英]How to iterate through an array of hashes inside an object with perl

我正在嘗試遍歷存儲為“人”object 的“_skills”屬性的哈希數組,但遇到了麻煩。

測試1.pl

my $person = new Person( "Hubert", "Blu",
    [
       {"name" => "Python", "Weight" => 80, "group","IT SKILLS", "id"=>0002},
       {"name" => "Magic", "Weight" => 100, "group", "MISC SKILLS", "id"=>0001},
       {"name" => "JavaScript","Weight" => 70, "group"=> "IT SKILLS", "id"=>0004},
       {"name" => "Mage","Weight" => 100, "group"=>"JOB TITLE", "id" =>0003},
       {"name" => "Assassin", "Weight" => 85, "group"=>"JOB TITLE"}
    ]
);


和 Person.pl

sub new {
    my ($class,$first_name,$last_name,@skills) = @_ ;
    my $self = {};
    $self->{"_first_name"} = $first_name;
    $self->{"_last_name"} = $last_name;
    @{$self->{"_skills"}} = @skills;
    # Print all the values just for clarification.
    print "First Name is $self->{_first_name}\n";
    print "Last Name is $self->{_last_name}\n";
    print "Skills : " . Data::Dumper::Dumper($self->{_skills}) . "\n";


    print"---SKILLS---\n";
    my $i = 1;
    foreach my $skill_set (@{$self->{_skills}}) {
        print "skill ".$i .": \n";
        $i++;
        #print Data::Dumper::Dumper($skill_set) . "\n";
        print "$skill_set->{'_first_name'}";
    };
    bless $self, $class;
    return $self;
}

第一個轉儲顯示數組,看起來不錯。 循環內的第二個轉儲再次顯示整個數組,它只循環一次,然后出現以下錯誤

Not a HASH reference at /home/izoom/PerlTrainingGround/LeeR/lib/Person/Person.pm line 26.

被困了幾個小時,一如既往地感謝您的幫助!

您正在將三個 arguments 傳遞給new和 invocant。 最后一個是對數組的引用。 這意味着@skills以一個值為該引用的元素結束。

my $person = new Person( "Hubert", "Blu",
    [
       {"name" => "Python", "Weight" => 80, "group","IT SKILLS", "id"=>0002},
       {"name" => "Magic", "Weight" => 100, "group", "MISC SKILLS", "id"=>0001},
       {"name" => "JavaScript","Weight" => 70, "group"=> "IT SKILLS", "id"=>0004},
       {"name" => "Mage","Weight" => 100, "group"=>"JOB TITLE", "id" =>0003},
       {"name" => "Assassin", "Weight" => 85, "group"=>"JOB TITLE"}
    ]
);

應該

my $person = new Person( "Hubert", "Blu",
   {"name" => "Python", "Weight" => 80, "group","IT SKILLS", "id"=>0002},
   {"name" => "Magic", "Weight" => 100, "group", "MISC SKILLS", "id"=>0001},
   {"name" => "JavaScript","Weight" => 70, "group"=> "IT SKILLS", "id"=>0004},
   {"name" => "Mage","Weight" => 100, "group"=>"JOB TITLE", "id" =>0003},
   {"name" => "Assassin", "Weight" => 85, "group"=>"JOB TITLE"}
);

或者

    my ($class,$first_name,$last_name,@skills) = @_ ;

    @{$self->{"_skills"}} = @skills;     # Useless shallow array copy
       # -or-
    $self->{"_skills"} = [ @skills ];    # Same[1] but clearer
       # -or-
    $self->{"_skills"} = \@skills;       # No copy of elements

應該

    my ($class,$first_name,$last_name,$skills) = @_ ;

    @{$self->{"_skills"}} = @$skills;    # Shallow array copy
       # -or-
    $self->{"_skills"} = [ @$skills ];   # Same[1] but clearer
       # -or-
    $self->{"_skills"} = $skills;        # No copy of elements

  1. 因為此時$self->{"_skills"}undef

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM