Schrift
[thread]10903[/thread]

Auflösung mehrdeutiger Methodenaufrufe



<< >> 10 Einträge, 1 Seite
Spieler
 2007-11-27 15:24
#103126 #103126
User since
2007-09-24
70 Artikel
BenutzerIn
[default_avatar]
Hallo,
Im folgenden Beispiel, wird der Mehrdeutige Ausdruck
A::B->new( test => 1 )
evaluiert als
A::B()->new( test => 1 )
oder
'A::B'->new( test => 1 )
abhängig davon, ob A geladen wird mit
use A;
oder mit
require A;

(hierbei könnte A::B auch in einem separaten file stehen)

Würdet ihr das erwarten?
Ist der Workaround
return 'A::B' unless (@_);
in sub A::B ein ausreichender Fix (wenn man als Verhalten
'A::B'->new( test => 1 ) erwartet)?

Grüße, Christoph
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
36
#!/usr/bin/perl
use strict;
use warnings;
use A;
#require A;
use Data::Dumper;

my $test = A::B->new(test => 1);
print Dumper $test;

__END__

file A.pm:

package A;
use strict;
use warnings;

sub B{
print "A::B called with args <@_>\n";
#return 'A::B' unless (@_);
shift;
return A::B->new(@_);
}

package A::B;

sub new{
print "A::B::new called with args: <@_>\n";
my $class = shift;
my $self = {@_};
bless $self, $class;
return $self;
}
1;


Output:
A::B called with args <>
A::B::new called with args: <A::B>
A::B::new called with args: <A::B=HASH(0x225314) test 1>
Attempt to bless into a reference at A.pm line 18.

Bzw.:
A::B::new called with args: <A::B test 1>
$VAR1 = bless( {
'test' => 1
}, 'A::B' );
renee
 2007-11-27 15:39
#103133 #103133
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ich halte das für einen Bug in Perl...
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/
renee
 2007-11-27 15:44
#103137 #103137
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ich würde es auf Verdacht mal als Bug einreichen... Ich konnte jetzt nichts in der Doku finden, das dieses Verhalten (und auch den Unterschied zum String-eval-"use") erklärt...

Wenn Du es nicht bis heute abend machst, werde ich das mal bei p5p anfragen.
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/
Spieler
 2007-11-27 16:39
#103148 #103148
User since
2007-09-24
70 Artikel
BenutzerIn
[default_avatar]
Hallo,
das wäre schön, wenn du das machst. Ich habe auch auf c.l.p.m. gepostet, habe aber eigentlich keine Zeit, um mich darum zu kümmern.

Grüße, Christoph
renee
 2007-11-27 16:53
#103158 #103158
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ich habe gerade noch etwas getestet. Das ganze hat irgendwie mit Compile- bzw. Laufzeit zu tun, denn auch ein einfaches "require" in einem BEGIN-Block führt zu dem Fehler...
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
 2007-11-27 17:24
#103171 #103171
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
siehe auch hier: Perlmonks:652383

eine der antworten: "Odd behavior when package and sub names are identical? My first suggestion is "don't do that.""
=)
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
renee
 2007-11-27 17:38
#103174 #103174
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Das ist aber keine gute Erklärung dafür, warum das Laden zur Compile-Zeit sich anders verhält als das Laden zur Laufzeit.

Meiner Meinung nach sollte sich das gleich verhalten. Es ist ja ok, wenn Perl da sagen würde "Hey, was soll das, das ist Unsinn!!", aber nicht bei einem require oder String-eval so und bei einem use bzw. BEGIN-Block anders...
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-11-27 17:42
#103175 #103175
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
Eine gute Erklärung findet sich hier Perlmonks:653272.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Spieler
 2007-11-27 23:34
#103196 #103196
User since
2007-09-24
70 Artikel
BenutzerIn
[default_avatar]
Vielen Dank,

Christoph
Strat
 2007-12-03 16:32
#103400 #103400
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
Das heisst, Relais' hatte mit folgender Schreibweise gar nicht so unrecht:
Code: (dl )
my $cgi = CGI::->new

perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< >> 10 Einträge, 1 Seite



View all threads created 2007-11-27 15:24.