Schrift
[thread]6096[/thread]

&{$name} beendet block: oder hab ich ein Blackout?

Leser: 1


<< |< 1 2 >| >> 13 Einträge, 2 Seiten
Froschpopo
 2004-02-26 10:57
#80326 #80326
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
irgendwie scheint &{$name}; einen block zu beenden.

ich hab mal grad versucht:

&{$name};
zweite();

jedoch wird &zweite nicht ausgeführt. das Programm scheint direkt hinter &{$name} aufzuhören.
Setze ich hingegen &zweite vor &{$name}; dann klappt alles. Kann jemand das bestätigen?

herzlichst
pq
 2004-02-26 12:36
#80327 #80327
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
nein, ich kann das nicht bestätigen. es wäre sinnvoll, wenn du ein
(kurzes! ) beispielskript postest, das den fehler reproduziert. ich
poste nun beispielcode, der macht, was er soll:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
perl -wle'
sub test {
print "test"
}
sub zwei {
print "zwei"
}
$name = "test";
&{$name};
zwei();'
test
zwei

nebenbei bemerkt ist der aufruf von &{$name} nicht empfehlenswert,
da hier eine symbolische referenz benutzt wird, und das ist nicht
strict-kompatibel, und das aus gutem grund. in den meisten fällen
gibt es möglichkeiten, symbolische referenzen zu umgehen.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Ishka
 2004-02-27 04:20
#80328 #80328
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
&{$var} ist nicht zwingend eine Symbolische Refferenz
(und sogar strict usw. konform)

Code (perl): (dl )
1
2
3
4
use strict;
use warnings;
my $sub=sub {print "Hallo Welt!"};
&{$sub}
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
esskar
 2004-02-27 04:33
#80329 #80329
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
na dann sieht das bei Froschpopo wohl so aus:

Code: (dl )
my $name = sub { exit(0); };
pq
 2004-02-27 14:18
#80330 #80330
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=Ishka,27.02.2004, 03:20]&{$var} ist nicht zwingend eine Symbolische Refferenz
(und sogar strict usw. konform)[/quote]
ach stimmt, na klar.
ich mache bei referenzen auf subroutinen immer sowas wie:
$subref->();
da hat mich wohl das &{$subref} verwirrt.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Froschpopo
 2004-02-27 15:55
#80331 #80331
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
[quote=pq,26.02.2004, 11:36]nein, ich kann das nicht bestätigen. es wäre sinnvoll, wenn du ein
(kurzes! ) beispielskript postest, das den fehler reproduziert. ich
poste nun beispielcode, der macht, was er soll:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
perl -wle'
sub test {
 print "test"
}
sub zwei {
 print "zwei"
}
$name = "test";
&{$name};
zwei();'
test
zwei

nebenbei bemerkt ist der aufruf von &{$name} nicht empfehlenswert,
da hier eine symbolische referenz benutzt wird, und das ist nicht
strict-kompatibel, und das aus gutem grund. in den meisten fällen
gibt es möglichkeiten, symbolische referenzen zu umgehen.[/quote]
Code: (dl )
1
2
3
4
   if (exists($PubVars{param('ID')})) {
update_my_session();
&{$PubVars{param('ID')}};
}


die funktion update_my_session() wird nur ausgeführt wenn ich sie VOR dem Subaufruf starte.

Aber mal eine andere Frage:
Warum ist das nicht empfehlenswert und was wäre die Alternative?
coax
 2004-02-27 23:48
#80332 #80332
User since
2003-08-11
457 Artikel
BenutzerIn
[default_avatar]
[quote=Froschpopo,27.02.2004, 14:55]Aber mal eine andere Frage:
Warum ist das nicht empfehlenswert und was wäre die Alternative?[/quote]
du koenntest einen Switch dafuer fuer verwenden.

Ich glaub empfehlenswert ist
Code: (dl )
&{$name};

nicht, weil $name alles moegliche enthalten kann und du eventuell nicht moechtest dass irgendwelche Subroutinen aufgerufen werden koennen. Und $name koennte auch einen Namen enthalten den es als Subroutine nicht gibt, etc.
In einen Switch kannst du testen ob die Subroutine existiert, und es werden nur die Subroutinen aufgerufen die dafuer vorgesehen sind.

Grusz Christian.
,,Das perlt aber heute wieder...'' -- Dittsche
Strat
 2004-02-28 00:00
#80333 #80333
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
einfach use strict verwenden, dann hat man das problem mit den symbolischen Referenzen nicht mehr. und falls man doch mal eine braucht, kann man ja mit no strict arbeiten, z.B. zum verankern einer sub in der symboltabelle:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
my @attributes = qw(color maximalgeschwindigkeit zylinder);

# generiere die noetigen Methoden
foreach my $attribute (@attributes) {
my $code = sub {
my ($self, $value) = @_;
$self->{ uc($attribute) } = $value if defined $value;
return $self->{ uc($attribute) };
};

no strict 'refs';
*{ $attribute } = $code;
} # foreach # ab hier ist strict wieder aktiv
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Froschpopo
 2004-02-28 17:03
#80334 #80334
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
coax: "nicht, weil $name alles moegliche enthalten kann und du eventuell nicht moechtest dass irgendwelche Subroutinen aufgerufen werden koennen. Und $name koennte auch einen Namen enthalten den es als Subroutine nicht gibt, etc."

Nein stimmt nicht, siehe Anweisung (mit exists()).

strat: bei meiner Lösung verwende ich strict !! Warum funktioniert das dann?

pq: wie machst Du das genau?\n\n

<!--EDIT|Froschpopo|1077980727-->
coax
 2004-02-28 17:39
#80335 #80335
User since
2003-08-11
457 Artikel
BenutzerIn
[default_avatar]
[quote=Froschpopo,28.02.2004, 16:03]Nein stimmt nicht, siehe Anweisung (mit exists()).[/quote]
Die Antwort bezog sich mehr auf das allgemeine Aufrufen ueber &{$name}; weil das ja von pq genannt wurde.
,,Das perlt aber heute wieder...'' -- Dittsche
<< |< 1 2 >| >> 13 Einträge, 2 Seiten



View all threads created 2004-02-26 10:57.