Schrift
[thread]6075[/thread]

Ungereimtheit in Perl



<< |< 1 2 >| >> 11 Einträge, 2 Seiten
DS
 2004-02-13 21:40
#80070 #80070
User since
2003-08-04
247 Artikel
BenutzerIn
[default_avatar]
So, ich hatte gerade ein fieses Problem in einem kleinen Script: Ich habe einen Hash erstellt auf folgende Weise:

Code: (dl )
1
2
3
4
my %hash = (
 a => &irgendeine_funktion(...),
 b => &irgendeine_funktion(...),
);

Jetzt gibt es hier ein gemeines Problem, wenn nämlich die Funktion "nichts zurückgibt", wobei "nichts zurückgibt" hier bedeutet, dass die Funktion mittels return; abgebrochen wird. In diesem Fall wird nämlich das Ergebnis von &irgendeine_funktion im Listenkontext ausgewertet (zumindest hab' ich mir das so zusammengereimt ;)), und als Folge quasi "ignoriert", d.h. der Hash schaut (bei 2x "nichts zurückgegeben") dann aus wie folgt: ( 'a' => 'b' )

Das das nicht Sinn und Zweck des Ganzen ist dürfte eigentlich auf der Hand liegen. Ebenso hätte ich gedacht, dass der =>-Operator seine beiden Parameter im skalaren Kontext auswertet, tja, leider ein Irrtum.

Umgehen kann man das Ganze z.B., indem man explizit undef zurückgibt oder die Funktion explizit im skalaren Kontext aufruft (scalar &irgendeine_funktion(...)).

So, also was sagt ihr: Ist das ein Denkfehler meinerseits, schlichtweg ein Bug in Perl oder aber auch irgendwas dazwischen?

Und: Gleich mal 'ne Entschuldigung für "=>-Operator". Ich weiß, dass es erst mit Perl6 soweit sein wird, und damit dürfte dann dieses Problem hier keins mehr sein.

Nachtrag: Mein letzter Absatz eben war doch eigentlich schon die Antwort, hm? Des is jetzt irgendwie blöd... ;)\n\n

<!--EDIT|DS|1076701302-->
Crian
 2004-02-13 22:26
#80071 #80071
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Wieso in Perl 6?

=> ist gleichbedeutend mit , und gibts schon.

???
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
DS
 2004-02-13 22:44
#80072 #80072
User since
2003-08-04
247 Artikel
BenutzerIn
[default_avatar]
Genau deswegen...

Perl5: => gleichbedeutend (fast) mit ,
Perl6: => ist ein eigenständiger Operator, der ein Pair zurückgibt
Crian
 2004-02-13 22:47
#80073 #80073
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
[quote=DS,13.02.2004, 21:44]fast[/quote]
??? Ich hatte es als syntaktischen Zucker für das Komma verstanden.

Und wieso wird das so verändert für Perl 6? Konnten die sich keinen eigenen Operator leisten? ;)
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
DS
 2004-02-13 22:56
#80074 #80074
User since
2003-08-04
247 Artikel
BenutzerIn
[default_avatar]
[quote=Crian,13.02.2004, 21:47]??? Ich hatte es als syntaktischen Zucker für das Komma verstanden.[/quote]

Quote
The => operator is a synonym for the comma, but forces any word to its left to be interpreted as a string (as of 5.001).

Deswegen darf man ja (a=>$a,b=>$b) schreiben.

[quote=Crian,13.02.2004, 21:47]Und wieso wird das so verändert für Perl 6? Konnten die sich keinen eigenen Operator leisten? ;)[/quote]
Hm, is' doch fein... das Ding erfüllt dann seinen Zweck wohl eher so wie man es erwartet... ;)
Crian
 2004-02-13 23:23
#80075 #80075
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
ach ja stimmt, das wusste ich auch schn mal :-/
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
kabel
 2004-02-17 14:47
#80076 #80076
User since
2003-08-04
704 Artikel
BenutzerIn
[default_avatar]
wie wäre es damit?
Quote
[xxx][yyy] # perl
sub a {return}
sub b {return 1 .. 3}

my %hash = (a => &a || "--NOT-DEFINED--", b => &b);

use Data::Dumper;
print STDOUT Dumper \%hash;

$VAR1 = {
'a' => '--NOT-DEFINED--',
'b' => 1,
'2' => 3
};
[yyy][xxx] #


imo ist das ein feature.
-- stefan
Strat
 2004-02-17 15:40
#80077 #80077
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=DS,13.02.2004, 21:56]The => operator is a synonym for the comma, but forces any word to its left to be interpreted as a string (as of 5.001).[/quote]
da gibt es bei manchen Perl-Versionen (5.6 und noch manchen 5.8) einen finsteren Bug, der in 5.8.2 gottseidank behoben wurde:
Code: (dl )
1
2
my %data = ( v70 => 'x' );
print keys %data;

da kam dann nicht v70 heraus, sondern F (der ascii-code von 70)

du koenntest auch schreiben:
Code: (dl )
1
2
3
4
%hash = (
 sub1 => &irgendwas($x, $y) || 'sonstwas',
 sub2 => &irgendwas2($x, $y) || 'bla',
);

nachteil: || veraendert eventuell den aufrufskontext (wird scalarer Kontext daraus) und koennte z.B. so auch wantarray durcheinanderbringen, wenn man das verwendet

i\n\n

<!--EDIT|Strat|1077025263-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
havi
 2004-02-17 17:35
#80078 #80078
User since
2003-08-04
2036 Artikel
BenutzerIn
[Homepage]
user image
[quote=Crian,13.02.2004, 21:47][quote=DS,13.02.2004, 21:44]fast[/quote]
??? Ich hatte es als syntaktischen Zucker für das Komma verstanden.

Und wieso wird das so verändert für Perl 6? Konnten die sich keinen eigenen Operator leisten? ;)[/quote]
Vielleicht hilft dir Klick ?!

Gruss
kabel
 2004-02-17 17:52
#80079 #80079
User since
2003-08-04
704 Artikel
BenutzerIn
[default_avatar]
[quote=Strat,17.02.2004, 14:40]nachteil: || veraendert eventuell den aufrufskontext (wird scalarer Kontext daraus) und koennte z.B. so auch wantarray durcheinanderbringen, wenn man das verwendet[/quote]
wenn die subroutine einen anderen als skalaren kontext verwendet, dann hat sie an dieser stelle nichts verloren.
ansonsten gibts noch die referenzoperatoren [], {}, die listenkontext erzeugen.
-- stefan
<< |< 1 2 >| >> 11 Einträge, 2 Seiten



View all threads created 2004-02-13 21:40.