Schrift
[thread]8523[/thread]

eval is evil: Willkommen auf der dunklen Seite?! (Seite 2)

Leser: 3


<< |< 1 2 >| >> 20 Einträge, 2 Seiten
renee
 2006-11-23 10:24
#71924 #71924
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=sid burn,22.11.2006, 22:58][...]
Mit goto wird die aktuelle Funktion durch eine andere ersetzt. Weiterhin wird die Funktion automatisch mit den Parameter von @_ aufgerufen.[/quote]
Was allerdings nichts mit dem goto zu tun hat sondern mit dem Funktionsaufruf mit &

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/perl

use strict;
use warnings;

foo('bar','test');

sub foo{
print "foo: @_ \n";
&test;
}

sub test{
print "test: @_ \n";
}


Ausgabe:
Code: (dl )
1
2
3
~/entwicklung 430> perl foobar.pl 
foo: bar test
test: bar test
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
pq
 2006-11-23 10:25
#71925 #71925
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
trotzdem verstehe ich nicht, warum ihr string-eval benutzen wollt.
was genau braucht ihr an string-eval, was eine stinknormale subref hier
nicht kann?
ronnie, dein beispiel als subref:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
sub add_method {
  my $self = shift;
  my $name = shift;
  die unless $name and $name =~ /^\w+$/;
  my $sub = sub {
          my $self = shift;
          my $item = $name;
          return [ @{ $self->{items} }, $item ];
  };
   no strict 'refs';
   *{$name} = $sub;
}

klärt mich doch mal bitte auf...
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
murphy
 2006-11-23 11:16
#71926 #71926
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
[quote=renee,23.11.2006, 08:24][quote=sid burn,22.11.2006, 22:58][...]
Mit goto wird die aktuelle Funktion durch eine andere ersetzt. Weiterhin wird die Funktion automatisch mit den Parameter von @_ aufgerufen.[/quote]
Was allerdings nichts mit dem goto zu tun hat sondern mit dem Funktionsaufruf mit &
[/quote][/quote]
Das hat sehr wohl etwas mit dem goto zu tun, mit goto bekommt man nämlich einen "tail call", ohne goto nicht. Die folgende Erweiterung Deines Beispiels sollte den Unterschied verdeutlichen:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/usr/bin/perl

use strict;
use warnings;

$, = ': ';
$" = ', ';

foo('bar','test');
print "foo returned to top level\n";

fuu('bar','test');
print "fuu returned to top level\n";

sub foo{
print "foo(@_) called by ";
print caller;
print "\n";
&test;
print "test returned to foo\n";
}

sub fuu{
print "fuu(@_) called by ";
print caller;
print "\n";
goto &test;
print "test returned to fuu\n";
}

sub test{
print "test(@_) called by ";
print caller;
print "\n";
}


Ausgabe:
Code: (dl )
1
2
3
4
5
6
7
8
% perl test.pl
foo(bar, test) called by main: test.pl: 9
test(bar, test) called by main: test.pl: 19
test returned to foo
foo returned to top level
fuu(bar, test) called by main: test.pl: 12
test(bar, test) called by main: test.pl: 12
fuu returned to top level
When C++ is your hammer, every problem looks like your thumb.
renee
 2006-11-23 11:29
#71927 #71927
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
mit dem goto kann man "beeinflussen", welches @_ genommen wird, aber allein die Tatsache dass die Parameter automatisch übergeben werden, kann auch goto erreicht werden. Das ist also kein wirkliches Argument für goto.

Edit: Hast Du irgendwelche Stellen, die zeigen, dass das goto für die Parameterübergabe an sich verantwortlich ist? Meiner Meinung nach ist trotz des goto das & dafür verantwortlich. Aber so tief stecke ich dann doch nicht in den Perl-Internas\n\n

<!--EDIT|renee|1164274507-->
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
sid burn
 2006-11-23 16:08
#71928 #71928
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Quote
mit dem goto kann man "beeinflussen", welches @_ genommen wird, aber allein die Tatsache dass die Parameter automatisch übergeben werden, kann auch goto erreicht werden. Das ist also kein wirkliches Argument für goto.

Das @_ als Prameter übernommen wird wenn man nur &funktion schreibt ist mir bekannt. Allerdings war dies nicht der Grund warum ich "goto" empfohlen habe.

goto wurde deswegen empfohlen weil es die aktuelle Funktion ersetzt und nicht nur einfach eine neue Funktion aufruft. Insgesamt soll es schneller sein. Weiterhin sollte schon viel Früher speicher freigegeben werden. Und nicht erst wenn die AUTOLOAD Funktion beendet wird.

Ich weiß nicht mehr wie der vorgang genau hieß. Ich glaube "Profilieren"??? Jedenfalls wenn du irgendwie eine Liste erzeugst wann welche Funktion aufgerufen wurde, dann würde bei der Benutzung von "goto" niemals AUTOLOAD in der Liste erscheinen. Sondern sofort die erstellte Methode.

Von aussen sieht es also so aus als wenn die Funktion schon immer existiert hat, und man bekommt nciht mit das die Funktion erstellt wurde.

Das ganze war dann noch für die Funktion "caller" wichtig. Da es beim Rücksprung auch "AUTOLOAD" anzeigen würde. Bei goto erscheint dann aber kein "AUTOLOAD".

Genau dieses verhalten wurde genutzt um Perl zu erweitern. Man konnte eine Art Interface schreiben wie in anderen programmiersprachen. Und wenn eine Subroutine nicht überschrieben wird, gibt es beim Compilieren schon eine Fehlermeldung. Wie das ganze aber jetzt genau lief wuste ich nicht mehr.

Insgesamt habe ich mir beim durchlesen einfach nur gemerkt das die Verwendung von "goto()" besser ist als die Funktion einfach nur aufzurufen.


Das Zusätzlich noch @_ übergeben wird, habe ich so noch genannt. Ob goto diese Funktionalität nochmals zusätzlich bietet oder ob jetzt nur das & vor der Funktion dafür zuständig ist, ist mir ehrlich gesagt aber auch ziemlich egal.

Funktionen müssen bei goto mit & aufgerufen werden (sonst wären es LABEL) und & bietet diese Funktionalität an sich auch schon. Von daher ist es doch volkommen Wurst wer jetzt genau @_ übergibt, oder? ;)\n\n

<!--EDIT|sid burn|1164290973-->
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
renee
 2006-11-23 16:15
#71929 #71929
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=sid burn,23.11.2006, 15:08]
Quote
mit dem goto kann man "beeinflussen", welches @_ genommen wird, aber allein die Tatsache dass die Parameter automatisch übergeben werden, kann auch goto erreicht werden. Das ist also kein wirkliches Argument für goto.

Das @_ als Prameter übernommen wird wenn man nur &funktion schreibt ist mir bekannt. Allerdings war dies nicht der Grund warum ich "goto" empfohlen habe.
[/quote]

Das war mir schon klar, das bezog sich auf murphy

Quote

[...]


Das Zusätzlich noch @_ übergeben wird, habe ich so noch genannt. Ob goto diese Funktionalität nochmals zusätzlich bietet oder ob jetzt nur das & vor der Funktion dafür zuständig ist, ist mir ehrlich gesagt aber auch ziemlich egal.

Funktionen müssen bei goto mit & aufgerufen werden (sonst wären es LABEL) und & bietet diese Funktionalität an sich auch schon. Von daher ist es doch volkommen Wurst wer jetzt genau @_ übergibt, oder? ;)

Ja, im Prinzip ist es völlig egal, das war ja jetzt mehr eine Diskussion zwischen murphy und mir. Ausgangspunkt war nur Dein einer Satz, der vielleicht auf einige so gewirkt hat, als wäre die Übergabe von @_ etwas goto-spezifisches...\n\n

<!--EDIT|renee|1164291962-->
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Ronnie
 2006-11-24 00:00
#71930 #71930
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
[quote=pq,23.11.2006, 09:25]ronnie, dein beispiel als subref:[/quote]
@pq: Das geht weil es ein Closure ist und so seine Umgebung mitnimmt, oder?
sid burn
 2006-11-24 01:25
#71931 #71931
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
[quote=Ronnie,23.Nov..2006, 23:00][quote=pq,23.11.2006, 09:25]ronnie, dein beispiel als subref:[/quote]
@pq: Das geht weil es ein Closure ist und so seine Umgebung mitnimmt, oder?[/quote]
Also wenn ich mal darauf antworten darf.
Eigentlich hat das Verfahren von pq nichts mit einer Closure zu tun. Sondern bei dem Verfahren wird die Symboltabelle direkt bearbeitet. Du solltest dir mal anschauen wie das Modul "Exporter" Arbeitet, das verfährt genauso.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/perl
use warnings;
use strict;

{ package foo;
my $name = 'hallo';
my $subref = sub {
print "Hallo, Welt!\n";
};
no strict 'refs';
*{'main::'.$name} = $subref;
}

package main;
hallo();


Die Technik basiert eher darauf das du einem Typeglob eine Subref zuweist. Das bedeutet nur der Code Teil des Typeglobs wird gesetzt. Der Wert für den Skalar, Array, Hash, Dateihandle, format etc. bleibt im Typeglob erhalten.

Mit "no strict 'refs'" kannst du dann den Funktionsname auch durch einen String angeben.

Durch diese Möglichkeit wird das exportieren ermöglicht.


Wenn der Sourcecode nicht Variabel zusammenebaut wird, solltest du auch eher diese Wegen gehen.
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
pq
 2006-11-24 01:34
#71932 #71932
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=sid burn,24.11.2006, 00:25]Also wenn ich mal darauf antworten darf.
Eigentlich hat das Verfahren von pq nichts mit einer Closure zu tun. Sondern bei dem Verfahren wird die Symboltabelle direkt bearbeitet.[/quote]
doch, es ist eine closure. die variable $name z.b. ist aussen definiert
und wird dann in der subref benutzt.
das zuweisen an die symboltabelle ist dann der zweite schritt.
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
murphy
 2006-11-24 14:31
#71933 #71933
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
[quote=renee,23.11.2006, 14:15][...]
Ja, im Prinzip ist es völlig egal, das war ja jetzt mehr eine Diskussion zwischen murphy und mir. Ausgangspunkt war nur Dein einer Satz, der vielleicht auf einige so gewirkt hat, als wäre die Übergabe von @_ etwas goto-spezifisches...[/quote]
@renee: Ich habe Dich wohl etwas missverstanden. Ich dachte, Du wolltest anzweifeln, dass goto &subroutine; überhaupt irgendetwas anderes tut als &subroutine;, was nicht richtig wäre. Die Parameterübergabe funktioniert allerdings wirklich in beiden Fällen gleich. Die Argumentliste wird sogar nicht einmal kopiert, sondern der Stack wird identisch übernommen.
When C++ is your hammer, every problem looks like your thumb.
<< |< 1 2 >| >> 20 Einträge, 2 Seiten



View all threads created 2006-11-22 21:21.