Leser: 3
|< 1 2 >| | 20 Einträge, 2 Seiten |
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;
use Data::Dumper;
package Foo;
sub new {
my $class = shift;
my $self = { items => \@_ };
return bless $self, $class;
}
sub add_method {
my $self = shift;
my $name = shift;
die unless $name and $name =~ /^\w+$/;
eval (
sub $name {
my $self = shift;
my $item = $name;
return [ @{$self->{items}}, $item ];
}
);
}
package main;
my $foo = Foo->new(qw/foo bar/);
print Dumper $foo;
$foo->add_method('buz');
print Dumper $foo->buz;
1
2
3
4
5
6
7
8
9
10
sub add_lambda {
my $self = shift;
my $name = shift;
die unless $name and $name =~ /^\w+$/;
$self->{$name} = sub {
my $self = shift;
my $item = $name;
return [ @{$self->{items}}, $item ];
}
}
1
2
3
4
5
6
7
my $name = "foobar";
my $sub = sub {
blabla
};
no strict 'refs';
*{$name} = $sub;
foobar();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
my @regexe = (
qr/Ausdruck0/,
qr/Ausdruck1/,
qr/Ausdruck2/,
qr/Ausdruck3/,
);
my @zaehler;
my $code = "while ( my \$zeile = <SUCHE> ) {\n";
for my $i ( 0 .. $#regexe ) {
$code .= "\tif ( \$zeile =~ m/$regexe[$i]/ ) { \$zaehler[$i] }\n";
}
$code .= "}\n";
print $code;
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+$/;
eval qq(
sub $name {
my \$self = shift;
my \$item = $name;
return \[ \@{\$self->{items}}, \$item \];
}
);
}
QuoteRuby erlaubt Methoden zur Laufzeit zu generieren und bietet auch Hook-Methoden wie undefined_method die aufgerufen werden wenn keine passende Methode existiert, was man wiederum nutzen kann um diese bei Bedarf zu generieren. Ich bin noch nicht wirklich weit mit dem Thema, habe aber eben schon überlegt wie es auf Perl transferierbar sein könnte.
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/perl
use warnings;
use strict;
our $AUTOLOAD;
sub AUTOLOAD {
$" = ', ';
print "Es wurde [$AUTOLOAD] mit den Parametern [@_] aufgerufen\n";
}
hallo();
welt( 'foo' );
wie( 'bar', 'shoe' );
1
2
3
Es wurde [main::hallo] mit den Parametern [] aufgerufen
Es wurde [main::welt] mit den Parametern [foo] aufgerufen
Es wurde [main::wie] mit den Parametern [bar, shoe] aufgerufen
$self->SUPER::DESTROY()
|< 1 2 >| | 20 Einträge, 2 Seiten |