Schrift
[thread]8699[/thread]

Routinen erzeugen

Leser: 3


<< |< 1 2 >| >> 19 Einträge, 2 Seiten
bloonix
 2007-01-30 16:53
#73841 #73841
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Hallo Community,

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
sub foo {
my $self = shift;
return $self->foobar('foo', @_);
}

sub bar {
my $self = shift;
return $self->foobar('bar', @_);
}

sub foobar {
return 1;
}


wie kann ich die Routinen &foo und &bar in einer Schleife erzeugen?
Ist sowas überhaupt möglich?

Beispiel:

Code: (dl )
1
2
3
for (qw(foo bar)) {
*{"$_"} = sub { my $self = shift; $self->foobar("$_", @_); };
}


Das klappt natürlich so nicht.

Gruss,
opi
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
renee
 2007-01-30 17:04
#73842 #73842
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/perl

package Foo;

BEGIN{
for('foo','bar'){
*$_ = sub{foobar(@_)};
}
}

sub foobar{
print $_,"\n" for @_;
}

package main;

Foo::foo('hallo');
Foo::bar('Opi');
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/
Taulmarill
 2007-01-30 17:25
#73843 #73843
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
imho sollte man einen sehr guten grund haben, wenn man so was macht. was spricht dagegen, z.b. coderefs in einen hash zu legen?
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
bloonix
 2007-01-30 18:50
#73844 #73844
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=Taulmarill,30.01.2007, 16:25]imho sollte man einen sehr guten grund haben, wenn man so was macht. was spricht dagegen, z.b. coderefs in einen hash zu legen?[/quote]
Wie meinst du das? Hast du ein Beispiel für mich?
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
PerlProfi
 2007-01-30 19:46
#73845 #73845
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
coderefs in einem hash:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
my %hash =
(
"foo" => \&foobar,
"bar" => \&foobar,
);

sub foobar{
print $_,"\n" for @_;
}

$hash{"foo"}->("hallo");
$hash{"bar"}->("opi");


MfG PerlProfi
pq
 2007-01-30 21:34
#73846 #73846
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=opi,30.01.2007, 15:53]
Code: (dl )
1
2
3
for (qw(foo bar)) {
  *{"$_"} = sub { my $self = shift; $self->foobar("$_", @_); };
}
[/quote]
Code: (dl )
1
2
3
4
for my $sub (qw(foo bar)) {
  no strict 'refs';
  *$sub = sub { my $self = shift; $self->foobar($sub, @_); };
}
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
bloonix
 2007-01-31 10:48
#73847 #73847
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=Taulmarill,30.01.2007, 16:25]imho sollte man einen sehr guten grund haben, wenn man so was macht.[/quote]
Nun, ich habe eine Methode, die als zweites Argument einen Prefix
erwartet. Die Prefixe möchte ich gerne als Methoden zur Verfügung
stellen.

Zum Beispiel erwartet die Methode foobar() einen der 4 Prefixe FOO, BAR,
OOF, RAB:

Code: (dl )
1
2
3
4
$foo->foobar('FOO', $message);
$foo->foobar('BAR', $message);
$foo->foobar('OOF', $message);
$foo->foobar('RAB', $message);

Statt dessen möchte ich gerne die Prefixe als Methoden anbieten:

Code: (dl )
1
2
3
4
$foo->foo($message);
$foo->bar($message);
$foo->oof($message);
$foo->rab($message);


Meine Lösung wäre also, entweder alle Routinen mit

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
sub foo {
  my $self = shift;
  return $self->foobar('FOO', @_);
}
sub bar {
  my $self = shift;
  return $self->foobar('BAR', @_);
}
sub oof {
  my $self = shift;
  return $self->foobar('OOF', @_);
}
sub rab {
  my $self = shift;
  return $self->foobar('RAB', @_);
}

zu erzeugen. Für jeden weiteren Prefix müsste ich eine weitere Sub auf
diese Weise erzeugen. Ich dachte mir daher, dass Ganze etwas abzukürzen
und in einer Schleife zu erledigen:

Code: (dl )
1
2
3
4
5
6
7
BEGIN {
  no strict 'refs';
  for my $prefix (qw(FOO BAR OOF RAB)) {
     my $sub = lc($prefix);
     *{$sub} = sub { my $self = shift; return $self->foobar($prefix, @_) }
  }
}


Was würde dagegen sprechen?

Danke übrigens für die Hilfe!\n\n

<!--EDIT|opi|1170233315-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
docsnyder
 2007-01-31 13:45
#73848 #73848
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
@opi

Quote
Statt dessen möchte ich gerne die Prefixe als Methoden anbieten:

Warum eigentlich? (Parameter sind doch gut.)

Du hast Recht, die Methoden kannst Du automatisch erzeugen, aber denke mal an den Code, der diese Methoden aufruft. Dort musst Du dann bei einer Erweiterung der Suffixe ggf. weitere Methoden-Aufrufe coden.

Gruß, Doc
pq
 2007-01-31 13:57
#73849 #73849
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
naja, CPAN:Class::Accessor u.a. machen es ja auch nicht anders und generieren
getter und setter. von daher spricht nichts dagegen, auch andere methoden so
zu generieren. allerdings würde ich auch den anwendungsfall sehen wollen, um
wirklich entscheiden zu können, ob es eine gute idee ist.
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
bloonix
 2007-01-31 17:11
#73850 #73850
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=docsnyder,31.01.2007, 12:45]Du hast Recht, die Methoden kannst Du automatisch erzeugen, aber denke mal an den Code, der diese Methoden aufruft. Dort musst Du dann bei einer Erweiterung der Suffixe ggf. weitere Methoden-Aufrufe coden.[/quote]
Die wird es nicht wahrscheinlich (?) nicht geben. =)

Verwendungszweck:

Code: (dl )
1
2
3
4
5
6
7
BEGIN {
no strict 'refs';
for my $sub (qw(debug info notice warning error critical alert emergency)) {
my $level = uc($sub);
*{"$sub"} = sub { my $self = shift; return $self->_print($level, @_); };
}
}


Alles andere wird von _print() erledigt.
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
<< |< 1 2 >| >> 19 Einträge, 2 Seiten



View all threads created 2007-01-30 16:53.