Schrift
[thread]7011[/thread]

Subs in subs?: Kann man lokale subs verwenden?

Leser: 1


<< >> 3 Einträge, 1 Seite
Ronnie
 2005-05-24 14:53
#55108 #55108
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Ich habe folgenden nicht ganz übersichtlichen code-Snippet, der ein AoH aus einer Datenbank-Abfrage erweitert um Mehrfachauswahlen:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
sub selection_extend {
my $self = shift;
my $result = shift || die "extend needs a resultset to extend\n";
my $db_lang = new DB::Languages;
my @languages = @{$db_lang->get()};

foreach my $person (@$result) {
my @selected_languages = map { $_->{'ID_language'} }
@{$self->get_attributes({'id' => $person->{'ID_person'}, 'attribute' => 'has_language_skill',})};
my @selection_list = map { my $cur_lang = $_->{'ID_language'};
$_->{'selected'} = 'true' if (grep ($_ == $cur_lang, @selected_languages));
$_; } @languages;
$person->{'has_language_skill'} = \@selection_list;
}
return $result;
}

Jetzt würde ich gerne den Inhalt der foreach-Schleife in eine lokale sub stecken, die aber nur innerhalb dieser Methode benötigt wird. Spricht irgendwas gegen das definieren von subs in subs?
coax
 2005-05-24 15:42
#55109 #55109
User since
2003-08-11
457 Artikel
BenutzerIn
[default_avatar]
Auch wenn du die Sub im Block einer anderen Sub definierst ist sie auszerhalb  dieses Blocks gueltig.
Hier wird bar() auszerhalb der foo() aufgerufen,
Code: (dl )
1
2
3
4
5
6
7
8
9
    bar();

   sub foo {
       print "foo\n";

       sub bar {
           print "bar\n";
       }
   }

und "bar" wird ausgegeben.
Du erziehlst so also keine Beschraenkung und kannst die Sub genauso auszerhalb definieren.
So ein Verhalten ist eigentlich nur ueber Closures zu erreichen (in der eine lokale Variable eine Referenz auf eine anonyme Sub haelt).\n\n

<!--EDIT|coax|1116935104-->
,,Das perlt aber heute wieder...'' -- Dittsche
betterworld
 2005-05-25 11:57
#55110 #55110
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
[quote=coax,24.05.2005, 13:42]So ein Verhalten ist eigentlich nur ueber Closures zu erreichen (in der eine lokale Variable eine Referenz auf eine anonyme Sub haelt).[/quote]
Closures sind auch aus dem Grunde zu bevorzugen, dass subs in subs mit my-Variablen selten das machen, was man moechte.
<< >> 3 Einträge, 1 Seite



View all threads created 2005-05-24 14:53.