Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Can't call method "new" on an undefined value

6 réponses
Avatar
pietro
Bonjour,

Je viens de r=E9cuperer la maintenance d'un site tournant sous PERL, que
je suis en train de d=E9couvrir, et j'ai le message suivant : Can't call
method "new" on an undefined value at
C:/WebSites/www.bvdep.com/cgi-bin/dbModules/Search.pm line 44.
La ligne 44 est la suivante : $body->add($topClass->new);

Je souhaiterais savoir :
1) ce qu'indique ce genre de message en g=E9n=E9ral?
2) dans le cas pr=E9sent, o=F9 dois-je chercher l'erreur?

D'avance, un grand merci pour votre aide.

Voici le code en question:

sub print
{
my $self =3D shift;

my $head =3D Head->new;
$head->link(Link->new(Consts::DOCSPATH()."styles.css"));
$head->title(Title->new("BvDEP - Customer Support - Search results:
"=2E$self->{FIELDS}->{SEARCHSTRING}));
$head->script(Script->new("javascript",
Product->new->navRolloverScript().$self->_script.DropDown->new->script));
my $body =3D Body->new;

my $topClass =3D $topClass{lc substr $self->{FIELDS}->{AREA}, 0, 1};
# $body->add(NeutralPageTop->new("press"));
$body->add($topClass->new);
# $body->add(NeutralPageTop->new(1));

my $table =3D Table->new;
$table->add(VSpacerRow->new(8));

my $navTable =3D Table->new;
my $areaConstants =3D AreaConstants->new($self->{FIELDS}->{AREA});

if ($areaConstants->area eq 's')
{
$navTable->add(RowOfCells->new(Products->new('c',
1)->supportDropdown));
$navTable->add(VSpacerRow->new(7));
$navTable->add(RowOfCells->new(ELearningQuickLinks->new));
$navTable->add(VSpacerRow->new(7));
$navTable->add(RowOfCells->new(NewsItems->new("p", undef, "c")));
}
else
{
$navTable->add(RowOfCells->new(Categories->new($areaConstants->area)));
$navTable->add(VSpacerRow->new(7));
$navTable->add(RowOfCells->new(Products->new($areaConstants->area)->dropd=
own));
$navTable->add(VSpacerRow->new(7));
$navTable->add(RowOfCells->new(NewsItems->new("p", undef,
$areaConstants->area)));
}

my $mainTable =3D $self->_mainTable;

my $contentTable =3D Table->new;
# $contentTable->add(RowOfCells->new(Spacer->new(56), $mainTable));
$contentTable->add(RowOfCells->new(Spacer->new(18), $navTable,
Spacer->new(17), $mainTable));
$table->add(RowOfCells->new($contentTable));

$table->add(VSpacerRow->new(1));

$table->add(RowOfCells->new(Null->new->add(Spacer->new(8),
Copyright->new(19))));

$body->add($table, Hidden->new(WHATTODO=3D>'FREETRIALFORMRESPONSE'));

my $height =3D 255;
$body->onmousedown("closeDropDowns()");
$body->onload("formResponseSpan.style.height=3Ddocument.body.clientHeight-=
$height");
$body->onresize("formResponseSpan.style.height=3Ddocument.body.clientHeigh=
t-$height");

Page->new($head, $body)->print;
}

6 réponses

Avatar
Paul Gaborit
À (at) 23 Jun 2005 04:18:53 -0700,
"pietro" écrivait (wrote):
Je viens de récuperer la maintenance d'un site tournant sous PERL, que


On écrit Perl (pour le langage) et perl pour son implémentation. PERL n'existe
pas.

je suis en train de découvrir, et j'ai le message suivant : Can't call
method "new" on an undefined value at
C:/WebSites/www.bvdep.com/cgi-bin/dbModules/Search.pm line 44.
La ligne 44 est la suivante : $body->add($topClass->new);

Je souhaiterais savoir :
1) ce qu'indique ce genre de message en général?


Pour en savoir plus sur les messages d'erreur produits par un script, vous
pouvez ajouter la ligne suivante au début du script :

use diagnostics;

Cela permet d'avoir des messages plus détaillés. Dans votre cas :

Can't call method "new" on an undefined value at
C:/WebSites/www.bvdep.com/cgi-bin/dbModules/Search.pm line 44.
(F) You used the syntax of a method call, but the slot filled by the
object reference or package name contains an undefined value. Something
like this will reproduce the error:

$BADREF = undef;
process $BADREF 1,2,3;
$BADREF->process(1,2,3);


2) dans le cas présent, où dois-je chercher l'erreur?


La variable $topClass contient la valeur 'undef' (la valeur non définie).
Or cette variable est définie juste à la ligne précédente :

my $topClass = $topClass{lc substr $self->{FIELDS}->{AREA}, 0, 1};

Donc
- soit %topClass ne contient pas ce qu'il faut
- soit 'lc substr $self->{FIELDS}->{AREA}, 0, 1' ne donne pas le résultat
escompté.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
Alex Marandon
On 2005-06-23, Paul Gaborit wrote:

On écrit Perl (pour le langage) et perl pour son implémentation. PERL
n'existe pas.


Mais si, PERL existe, il y a même un module pour l'utiliser depuis Perl :
http://search.cpan.org/~jmcnamara/Acme-Inline-PERL-0.01/PERL.pm

;-)

Avatar
Paul Gaborit
J'écrivais :
On écrit Perl (pour le langage) et perl pour son implémentation.
PERL n'existe pas.



À (at) 23 Jun 2005 14:51:46 GMT,
Alex Marandon écrivait (wrote):
Mais si, PERL existe, il y a même un module pour l'utiliser depuis Perl :
http://search.cpan.org/~jmcnamara/Acme-Inline-PERL-0.01/PERL.pm

;-)


Effectivement, j'avais raté ce langage.Quand on lit la doc, ça fait peur :

PERL is a programming language for writing CGI applications. It's main
strength is that it doesn't have any unnecessary warnings or
strictures. It is a direct descendent of Perl, a programming language
which was used mainly by programmers. However, the original language
required too much reading and thinking and so PERL was developed as a
language which was more in tune with the requirements of the Internet age.

Quand à la documentation PERL :

Unfortunately there is no documentation for PERL (believe me I've looked
everywhere). Therefore, the best thing to do is to go straight to
comp.lang.perl.misc and ask your questions there.

Avec un tel conseil, l'accueil sur comp.lang.perl.misc risque d'être chaud ;-)

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>


Avatar
pietro
Bien. Je ferais attention à l'avenir :-).

En attendant ...

my $topClass = $topClass{lc substr $self->{FIELDS}->{AREA}, 0, 1}; ne
renvoie effectivement rien.
J'ai aussi vu que topClass était également defini plus haut dans la
page, à la ligne 16.

On a donc ceci:
Ligne 16:
my %topClass = (c=>"CompanyInformationProductsPageTop",
e=>"ElectronicPublishingPageTop", s=>"NeutralPageTop");

Ligne 42:
my $topClass = $topClass{lc substr $self->{FIELDS}->{AREA}, 0, 1};

ligne 44:
$body->add($topClass->new);

Le problème serait-il dans ces 3 lignes?

Merci de votre aide.
Avatar
Paul Gaborit
À (at) 24 Jun 2005 02:32:28 -0700,
"pietro" écrivait (wrote):
my $topClass = $topClass{lc substr $self->{FIELDS}->{AREA}, 0, 1}; ne
renvoie effectivement rien.
J'ai aussi vu que topClass était également defini plus haut dans la
page, à la ligne 16.

On a donc ceci:
Ligne 16:
my %topClass = (c=>"CompanyInformationProductsPageTop",
e=>"ElectronicPublishingPageTop", s=>"NeutralPageTop");

Ligne 42:
my $topClass = $topClass{lc substr $self->{FIELDS}->{AREA}, 0, 1};

ligne 44:
$body->add($topClass->new);

Le problème serait-il dans ces 3 lignes?


$topClass prend une valeur dans %topClass. Les seules clés existantes sont
'c', 'e' et 's'.

Si 'lc substr $self->{FIELDS}->{AREA}, 0, 1' ne retourne pas l'une de ces
trois valeurs, ça plante.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
pietro
'lc substr $self->{FIELDS}->{AREA}, 0, 1' ne retourne effectivement
aucune de ces trois valeurs. C'est donc bien à ce niveau que se situe
le problème.
Il ne me reste plus qu'à tenter de comprendre pourquoi...

Merci encore :-)