Масив от хешове, които не се предават от ref към sub

Имам сетер sub setAssignmentStatus, който взема масив от хешове (AoH оттук нататък) и друг параметър (не се занимавайте с това, тъй като тази част работи) и прави нещо итерация през AoH, за да зададе друг запис във всеки хеш елемент. Не връща нищо, защото искам да използвам същия обект AoH с добавените записи, след като бъде изтеглен през подчинителя на настройката, а не да конструирам изцяло нов AoH и да попълвам отново записите. Ето го сетерът:

sub setAssignmentStatus
{
    my $fileFlatArySclr = $_[0];
    my $cfgFile = $_[1];

    #here I convert the AoH from the scalar necessary for the sub to its native form
    my @fileFlatAry = @$fileFlatArySclr;

    #this works, don't worry
    my %cfgVarHash = getConfigVars($cfgFile);

    foreach my $fileVarHashSclr(@fileFlatAry)
    {
        #convert each AoH entry from scalar necessary for iteration to native hash
        my %varHash = %$fileVarHashSclr;

        my $varName = $varHash{'VAR_NAME'};

        my $asgnLineCnt = $varHash{'ASGN_CNT'};

        my $asgnSts;
        my $fileAsgnSts; 
        my $cfgAsgnSts; 

        if($asgnLineCnt > 0) { $fileAsgnSts = 1; } else { $fileAsgnSts = 0; }

        my $cfgAsgnLine = $cfgVarHash{$varName};

        if($cfgAsgnLine ne undef) { $cfgAsgnSts = 1; } else { $cfgAsgnSts = 0; }

        $asgnSts = $fileAsgnSts.$cfgAsgnSts;

        #debug to make sure $asgnSts is not null in the first place (it is not!)
        print "\n*** setting ASGN_STUS of ".$varName." to ".$asgnSts;

        #Here we set ASGN_STUS for every iteration
        $varHash{'ASGN_STUS'} = $asgnSts;
    }
}

Нарича се по следния начин:

setAssignmentStatus(\@fileFlatAry, $cfgFile);

Въпреки това, след изпращане на @fileFlatAry AoH до setAssignmentStatus, всеки хеш елемент не съдържа запис ASGN_STUS. Защо е така и как мога да го поправя?

Подозрението ми е, че правя нещо нередно с модификатора \, което е начинът, по който получавам структурата на данните да бъде предадена като скаларен параметър към подчинителя, но не съм сигурен.


person amphibient    schedule 02.02.2013    source източник


Отговори (1)


Вие променяте %varHash вместо да модифицирате посочения хеш. Спрете да копирате всичко в локални променливи и да модифицирате локалните променливи.

$varHash{'ASGN_STUS'} = ...;

би трябвало

$fileVarHashSclr->{'ASGN_STUS'} = ...;

И аз не бих направил my @fileFlatAry = @$fileFlatArySclr;. Чисти отпадъци.

person ikegami    schedule 02.02.2013
comment
Не, не е. Това е копие на елемент (или по-скоро хеш, посочен от елемент). - person ikegami; 02.02.2013
comment
ако не бихте направили my @fileFlatAry = @$fileFlatArySclr;, как иначе бихте итерирали през масива? - person amphibient; 02.02.2013
comment
бях го правил така преди. причината, поради която го правя на отделен ред, е моето предпочитание да направя всеки ред код възможно най-прост с възможно най-малко оценки на този ред. това в крайна сметка води до повече редове код, но всеки ред е прост и за мен е по-лесно да го поддържам по този начин. - person amphibient; 02.02.2013
comment
(И наистина се заблуждавате, като твърдите, че my %varHash = %$otherHash; my $x = $varHash{'ASGN_STUS'}; се чете по-лесно от my $x = $otherHash->{'ASGN_STUS'};.) - person ikegami; 02.02.2013