sort, $a, $b

sort, $a, $b

am 03.08.2006 19:34:00 von Torsten Mohr

Hallo,

in der Doku zu "sort" ist bei der Verwendung einer Unterfunktion
erwähnt daß $a und $b als "package globals" übergeben werden.

Ich habe nicht gesehen daß vorher enthaltene Werte gesichert
werden.  Das scheint aber zu passieren, vorher in $a und $b
enthaltene Werte sind nach einem "sort" mit Unterfunktion auch
wieder in $a und $b.

Habe ich das in der Doku übersehen?  Ich hätte erwartet daß $a
und $b die letzten verglichenen Werte enthalten.


Grüße,
Torsten.

Re: sort, $a, $b

am 06.08.2006 12:23:40 von Christian Lackas

* Torsten Mohr [2006-08-03]:

Hallo Torsten,

> in der Doku zu "sort" ist bei der Verwendung einer Unterfunktion
> erwähnt daß $a und $b als "package globals" übergeben werden.

das bezieht sich mehr darauf, dass die Variablen in der Symboltabelle
stehen, damit einen dynamischen Scope haben und man keine lexikalischen
Versionen nehmen sollte. Beide werden aber quasi mit 'local'
lokalisiert. Wenn du in der Subroutine aber in eine weitere Funktion
springst, dann findest du dort auch in $a und $b deine Werte.

Simples Beispiel:

sub sort_func { ... }
sort sort_func @list;

Wenn $a, $b keinen dynamischen Scope hätten, dann könntest du in
sort_func ja nicht darauf zugreifen.

> Ich habe nicht gesehen daß vorher enthaltene Werte gesichert werden.

Wo hast du das nicht gesehen? Im Code?

Gruß
Christian

--
Das Credo des heutigen Menschen lautet:
'Ich glaube an das Image, an den Computer und an die Demoskopie.'
(Vittorio de Sica, ital. Regisseur u. Schauspieler, 1902-1974)
http://www.lackas.net/ Perl Delphi Linux MP3 Searchengines Domainchecker

Re: sort, $a, $b

am 06.08.2006 23:41:58 von Torsten Mohr

Hallo,

>> Ich habe nicht gesehen daß vorher enthaltene Werte gesichert werden.
>
> Wo hast du das nicht gesehen? Im Code?

erstmal danke für deine Tips.

Ich beziehe mich auf "perldoc -f sort". Das hatte ich nicht so
interpretiert daß perl "local" auf $a und $b anwendet, was ja
sinnvoll ist.


Grüße,
Torsten.

Re: sort, $a, $b

am 04.09.2006 18:59:30 von Ferry Bolhar

Torsten Mohr:

> in der Doku zu "sort" ist bei der Verwendung einer Unterfunktion
> erwähnt daß $a und $b als "package globals" übergeben werden.

Die Unterfunktion hat - wie jede Funktion - einen eigenen lexikalischen
Geltungsbereich. Mit "package globals" ist gemeint, dass $a und $b
aber als globale, "local"-isierte Variable übergeben werden und nicht
etwa als lexikalische (und daher auch nicht als solche in der Funktion
deklariert werden dürfen!). Somit bleiben Werte, die außerhalb der
sort-Funktion gesetzt wurden, erhalten.

Innerhalb der sort-Funktion sind $a und $b eigentlich Aliase, die
bei jedem Aufruf der Funktion auf je zwei andere Elemente des zum
Sortieren übergebenen Arrays zeigen (und die daher auch read-only
sind).

> Ich habe nicht gesehen daß vorher enthaltene Werte gesichert
> werden. Das scheint aber zu passieren, vorher in $a und $b
> enthaltene Werte sind nach einem "sort" mit Unterfunktion auch
> wieder in $a und $b.

Ja, siehe oben. Bevor $a und $b mit den Werten der Arrayelemente
überschrieben werden, werden sie "local"-isiert.

> Habe ich das in der Doku übersehen? Ich hätte erwartet daß $a
> und $b die letzten verglichenen Werte enthalten.

Nein, genauso wenig wie bei jeder anderen Funktion (oder jedem
anderen Block), die/der globale Variable "local"-isiert:

$a = 1;
mysort();
print "$a\n";

sub mysort {
local $a = 2;
print "$a, ";
}

Gibt "2, 1" aus.

Übrigens: was hätte es dir genutzt, die beiden zuletzt verglichenen
Werte zu bekommen? Welche das sind, ist nicht vorhersagbar und
von Perl-Version zu Perl-Version (in Abhängigkeit des verwendeten
Sortier-Algorithmus) unterschiedlich.

LG, Ferry

--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at

Re: sort, $a, $b

am 07.09.2006 21:27:47 von Torsten Mohr

Hallo,

danke für die Antwort.

>> Habe ich das in der Doku übersehen? Ich hätte erwartet daß $a
>> und $b die letzten verglichenen Werte enthalten.
>
> Nein, genauso wenig wie bei jeder anderen Funktion (oder jedem
> anderen Block), die/der globale Variable "local"-isiert:

Rein formal hat mir gefehlt daß die Variablen "local"-isiert
werden. Ich habe eigentlich auch nicht erwartet daß eventuelle
globale Variablen $a und $b überschrieben werden, das wäre ja
auch nicht sinnvoll. Aber die Beschreibung interpretiere ich
immer noch so, ich entdecke den Teil nicht, in dem beschrieben
ist daß $a und $b nicht als "local" übergeben werden.

> Übrigens: was hätte es dir genutzt, die beiden zuletzt verglichenen
> Werte zu bekommen? Welche das sind, ist nicht vorhersagbar und
> von Perl-Version zu Perl-Version (in Abhängigkeit des verwendeten
> Sortier-Algorithmus) unterschiedlich.

Ja, das halte ich auch für sinnlos, es ging mir mehr um die
Beschreibung in perldoc -f sort.


Viele Grüße,
Torsten.