Schrift
[thread]12568[/thread]

Probleme beim Testen von Class::Util

Leser: 2


<< >> 6 Einträge, 1 Seite
skirnir
 2008-10-01 12:02
#115054 #115054
User since
2006-05-09
29 Artikel
BenutzerIn
[default_avatar]
Hallo,

beim Versuch Class::Util zu installieren schlägt 'make test' folgendermaßen fehl:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
t/11_load.................NOK 2/5                                            
# Failed test 'Loading a missing class'
# at t/11_load.t line 13.
# 'Can't use string ("c1::") as a HASH ref while "strict refs" in use at /root/.cpan/build/OOTools-2.21-kx3KPN/blib/lib/Class/Util.pm line 30.
# '
# doesn't match '(?-xism:^Can't locate)'
t/11_load.................NOK 3/5
# Failed test 'Re-loading a loaded class'
# at t/11_load.t line 21.
# Looks like you failed 2 tests of 5.
t/11_load.................dubious
Test returned status 2 (wstat 512, 0x200)
DIED. FAILED tests 2-3
Failed 2/5 tests, 60.00% okay


Die Funktion in Util.pm sieht folgendermaßen aus:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
; sub load
   { local $_ = $_[0] if defined $_[0]
   ; my $r = eval "require $_;"
   ; if ($@)
      { (my $c = $_.'.pm') =~ s|\b::\b|/|g
      ; croak $@ if $@ !~ /^Can't locate $c in \@INC/
                    || not defined %{$_.'::'} # <--- Zeile 30
      }
   ; $r
   }


Das obere ist der von Domizio Demichelis favorisierte Perlish Coding Style, deshalb der Lesbarkeit halber derselbe Auszug nochmal nach einem perltidy Durchlauf:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
sub load {
    local $_ = $_[0] if defined $_[0];
    my $r = eval "require $_;";
    if ($@) {
        ( my $c = $_ . '.pm' ) =~ s|\b::\b|/|g;
        croak $@
          if $@ !~ /^Can't locate $c in \@INC/
              || not defined %{ $_ . '::' }; # <--- Zeile 30
    }
    $r;
}


Ich glaube schon, dass ich im Groben verstehe, was die Funktion macht, aber ausgerechnet was mit der Zeile 30 bezweckt wird, ist mir schleierhaft. Kann mir vielleicht jemand einerseits erklären, was die Dereferenzierung in der Zeile bezweckt und hat jemand eine Idee, unter welchen Voraussetzungen ich den Test bestehen kann?

Umgebung ist perl 5.10.0 unter Fedora 9. Ich habe diese Version von Class::Util schon erfolgreich mit perl 5.8.8 und 5.8.5 installiert. Liegt das Problem vielleicht im perldelta?
renee
 2008-10-01 13:23
#115061 #115061
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Kurz zur Erklärung. Der Autor überprüft, ob es %c1:: gibt. %c1:: ist der "Stash" für das package c1. Auf einem Stash landen die (globalen) Variablen.

Wenn Du folgendes machst:

Code (perl): (dl )
1
2
3
4
5
6
7
8
#!/usr/bin/perl

use strict;
use warnings;

our $test = 1;

print $::test;
greifst Du auf den Stash von main ( %:: entspricht %main::) zu.

Den Fehler kann ich mir aber nicht wirklich erklären, weil eigentlich ein Stash erzeugt wird wenn das Modul geladen wird. Wenn das Modul nicht gefunden wird, kommt aber die "Can't locate"-Meldung. Die defined-Prüfung sollte eigentlich nicht erreicht werden. Jedenfalls habe ich das mit dem load-Code nicht nachvollziehen können.

Ansonsten ist %{ $_ . '::' } unter strict (und das verwendet der Autor) nicht erlaubt, weil das symbolische Referenzen sind. Der Autor sollte hier in dem if ( $@ ) {} das strict mittels no strict 'refs' ausschalten.
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/
skirnir
 2008-10-01 15:48
#115065 #115065
User since
2006-05-09
29 Artikel
BenutzerIn
[default_avatar]
Danke für die Erklärung.
Ich habe mal versucht,
Code: (dl )
no strict 'refs'
einzubauen. Jetzt bekomme ich diesen Fehler:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
t/11_load.................NOK 2/5                                            
# Failed test 'Loading a missing class'
# at t/11_load.t line 13.
# ''
# doesn't match '(?-xism:^Can't locate)'
# Looks like you failed 1 test of 5.
t/11_load.................dubious
Test returned status 1 (wstat 256, 0x100)
DIED. FAILED test 2
Failed 1/5 tests, 80.00% okay


Der entsprechende Test sieht so aus:

Code (perl): (dl )
1
2
3
; my $c1 = 'c1'
; eval{ Class::Util::load $c1 }
; like $@, qr/^Can't locate/, 'Loading a missing class'


Wäre zu erklären, wenn nurdie Bedingung
Code: (dl )
not defined %{ $_ . '::' }
greifen würde (was nach deiner Erklärung zumindest sehr unwahrscheinlich ist). [<--EDIT: Satz berichtigt]

Interessanterweise bekomme ich aber das, was der Test mutmaßlich erwartet über diesen Einzeiler (nach einem force install):

Code: (dl )
1
2
3
4
5
6
# perl -MClass::Util -e 'Class::Util::load c1; print $@'
Can't locate c1.pm in @INC (@INC contains: /usr/lib/perl5/5.10.0/i386-linux-thread-multi /usr/lib/perl5/5.10.0
/usr/local/lib/perl5/site_perl/5.10.0/i386-linux-thread-multi /usr/local/lib/perl5/site_perl/5.10.0 /usr/lib/perl5
/vendor_perl/5.10.0/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.10.0 /usr/lib/perl5/vendor_perl /usr/local
lib/perl5/site_perl/5.10.0/i386-linux-thread-multi /usr/local/lib/perl5/site_perl/5.10.0 /usr/local/lib/perl5/site_perl
/usr/lib/perl5/site_perl .) at (eval 1) line 1.

^ Zeilenumbrüche von mir

Wie kann das sein?
renee
 2008-10-01 16:04
#115067 #115067
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Edit: an mich selbst: genauer lesen wäre von Vorteil
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
 2008-10-01 16:24
#115069 #115069
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Schau mal, ob Du nicht irgendwo in @INC eine c1.pm rumfliegen hast. Die Fehler kann man dadurch erklären, dass c1.pm zwar geladen wird, aber einen anderen Fehler wirft (z.B. weil am Ende kein "wahrer" Wert zurückgeliefert wird).

Ich habe vorher auch einen Denkfehler gehabt...
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/
skirnir
 2008-10-01 16:57
#115074 #115074
User since
2006-05-09
29 Artikel
BenutzerIn
[default_avatar]
Danke für deine Hilfe, aber das scheint wohl was größeres zu sein:

http://cpantesters.perl.org/show/OOTools.html

geht anscheinend immer mit perl 5.10.0 schief.


und hier gibt's noch einen ein Jahr alten Bug-Report:

http://rt.cpan.org/Public/Bug/Display.html?id=2982...

ich werde wohl mal perl 5.8.8 installieren...
<< >> 6 Einträge, 1 Seite



View all threads created 2008-10-01 12:02.