Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]8529[/thread]

Funktionen erweitern: Funktionsname aus Referenz?



<< >> 6 Einträge, 1 Seite
Ronnie
 2006-11-25 18:31
#72003 #72003
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Nach den tollen Antworten und Anregungen zu meinem 'eval is evil'-Thread, habe ich nun eine neue Problemstellung. Ich habe überlegt wie man Funktionen nachträglich z.B. eine Validierung der Argumente aufzwingen kann. Das folgende Beispiel macht genau das, nur habe ich den Namen der übergebenen Funktion 'hart' eingebaut. Kann ich aus der Referenz auf die Funktion an deren Namen kommen? Oder verfolge ich einen falschen Ansatz?
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
#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;

sub foo {
return "foo:\t" . $_[0];
}

sub contract_on {
my $func = shift;

my $sub = sub {
my $i = shift;
warn "need an integer!" unless ($i =~ /\d+/);
return $func->($i);
};

no strict 'refs';
no warnings;
*{'foo'} = $sub; # woher bekommt man den Namen der Funktion?
}


print foo('X') . "\n";
contract_on \&foo;
print foo('X') . "\n";
ptk
 2006-11-25 20:45
#72004 #72004
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Möchtest du vielleicht etwas in der Art:
Code: (dl )
1
2
3
4
5
6
7
8
9
my $orig_menu_post;
BEGIN {
$orig_menu_post = \&post;
}
*post = sub {
my($self, $x, $y) = @_;
# ... irgendetwas machen ...
$orig_menu_post->($self, $x, $y); # Original aufrufen
};
Ronnie
 2006-11-26 12:19
#72005 #72005
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
[quote=ptk,25.11.2006, 19:45]Möchtest du vielleicht etwas in der Art (...)[/quote]
Hallo ptk, das entspricht ja dem oben gezeigten Code und setzt voraus das man den Namen der zu erweiternden Funktion kennt. Meine Idee ist es ein Modul zu haben das man problemlos nutzen kann um existierenden Code (z.B. Legacy-Code) schnell und problemlos um eine Validierung der Argumente erweitern kann. Wenn es OOP-Code ist wäre subclassing eine Möglichkeit, aber ich wollte einen allgemeineren Ansatz.
ptk
 2006-11-26 14:39
#72006 #72006
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Suchst du CPAN:Hook::WrapSub oder CPAN:Hook::LexWrap?
Ronnie
 2006-11-26 15:23
#72007 #72007
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
[quote=ptk,26.11.2006, 13:39]Suchst du CPAN:Hook::WrapSub oder CPAN:Hook::LexWrap?[/quote]
Ja, das gefällt mir. Ich muss mir mal die Quellcodes näher betrachten. Danke!
pq
 2006-11-26 15:35
#72008 #72008
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
ich hab mal Wiki:das hier
geschrieben, das fuegt jeder subroutine ein logstatement hinzu,
mit welchen argumenten sie aufgerufen wurde und was sie zurueckgibt.
koennte auch nuetzlich sein, sich den code mal anzuschauen, obwohl es
sicher besser ist, eins der cpan-module dafuer zu benutzen.

oder aber CPAN:Aspect, aber das modul wurde wohl die letzten 2
jahre nicht angefasst...\n\n

<!--EDIT|pq|1164548392-->
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
<< >> 6 Einträge, 1 Seite



View all threads created 2006-11-25 18:31.