OVH Cloud OVH Cloud

Using a hash as a reference is deprecated

16 réponses
Avatar
Le Souricier Gris
Bonjour,

afin de progresser dans ma compr=E9hension du PERL, je cherche =E0 savoir
comment corriger le probl=E8me :
Using a hash as a reference is deprecated

La structure de donn=E9es que je d=E9sire utilis=E9e est celle-ci (affich=
=E9e
=E0 l'aide de Dumper) :
$VAR1 =3D {
'lang' =3D> 'fr_FR',
'ver' =3D> '0.01',
'command' =3D> {
'setpenwidth' =3D> {
'keyword' =3D> 'taillecrayon',
'alias' =3D> 'ftc'
},
'begin' =3D> {
'keyword' =3D> '['
}
}
};

Aussi, afin de r=E9cup=E9rer les =E9l=E9ments, j'ai =E9crit le code suivant=
:

my $commande=3D$data->{'command'};

foreach my $englogokey (keys (%$commande))
{
print $englogokey."\n";
}

Quelqu'un pourrait t'il me corriger et tenter de m'expliquer cette
syntaxe d=E9pr=E9ci=E9e ?

Merci

6 réponses

1 2
Avatar
ebrnospam
Paul Gaborit a écrit :
À (at) Thu, 25 Sep 2008 01:02:40 -0700 (PDT),
Le Souricier Gris écrivait (wrote):
On 24 sep, 23:15, Paul Gaborit wrote:
(at) Wed, 24 Sep 2008 13:18:40 -0700 (PDT),




[...]
Sur quelle ligne de votre code se produit ce message ?




[...]
J'ai rajouté la commande désirée :
print $commande->{$englogokey}->{'keyword'}."n";

Et pas d'erreur, j'envoie le programme complet ce soir (Utilise
XML::Simple).



Donc l'erreur n'est pas liée à cette ligne. Si vous répondiez à ma
première question (à quelle ligne à lieu l'erreur), cela vous aiderait
sûrement (et nous aussi pour éventuellement vous aider).




This is perl, v5.8.8 built for i486-linux-gnu-thread-multi

Voici comme promis les programmes complets (épurés)

Fichier logo2.xml

<?xml version="1.0"?>
<!DOCTYPE logokeywords>
<!-- please save as utf8 encoding -->
<logokeywords lang="fr_FR" ver="0.01">

<!-- standard BASIC commands -->

<command name="begin">
<keyword>[</keyword>
</command>

<command name="setpenwidth">
<keyword>taillecrayon</keyword>
<alias>ftc</alias>
</command>

</logokeywords>

Fichier logo.pl

#!/usr/bin/perl -w

# utiliser le module
use XML::Simple;
use Data::Dumper;
use Unicode::String;
use utf8;

# créer un objet
$xml = new XML::Simple ();

# lire le fichier XML
$data = $xml->XMLin("logo2.xml");

# accéder aux données XML
print Dumper ($data);

my $commande=$data->{'command'};
print Dumper ($commande);

foreach my $englogokey (keys (%$commande))
{
print $englogokey."n";

#
# Divers essais pour lire correctement keyword et alias
#

my $frelogokey=%{$commande}->{$englogokey};

print $frelogokey->{'keyword'}."n";
print $frelogokey->{'alias'}."n" if defined ( $frelogokey->{'alias'} );

print %$commande->{$englogokey}->{'keyword'}."n";
print %$commande->{$englogokey}->{'alias'}."n" if defined (
%$commande->{$englogokey}->{'alias'} );
}

exit 0;


Ici apparaissent plusieurs essais de codages qui entraînent des erreurs
comme indiquées dans le Sujet en ligne

Using a hash as a reference is deprecated at ./logo.pl line 24.
Using a hash as a reference is deprecated at ./logo.pl line 28.
Using a hash as a reference is deprecated at ./logo.pl line 29.
Using a hash as a reference is deprecated at ./logo.pl line 29.
Avatar
ebrnospam
Paul Gaborit a écrit :
À (at) Thu, 25 Sep 2008 01:02:40 -0700 (PDT),
Le Souricier Gris écrivait (wrote):
On 24 sep, 23:15, Paul Gaborit wrote:
(at) Wed, 24 Sep 2008 13:18:40 -0700 (PDT),




[...]
Sur quelle ligne de votre code se produit ce message ?




[...]
J'ai rajouté la commande désirée :
print $commande->{$englogokey}->{'keyword'}."n";

Et pas d'erreur, j'envoie le programme complet ce soir (Utilise
XML::Simple).



Donc l'erreur n'est pas liée à cette ligne. Si vous répondiez à ma
première question (à quelle ligne à lieu l'erreur), cela vous aiderait
sûrement (et nous aussi pour éventuellement vous aider).




This is perl, v5.8.8 built for i486-linux-gnu-thread-multi

Voici comme promis les programmes complets (épurés)

Fichier logo2.xml

<?xml version="1.0"?>
<!DOCTYPE logokeywords>
<!-- please save as utf8 encoding -->
<logokeywords lang="fr_FR" ver="0.01">

<!-- standard BASIC commands -->

<command name="begin">
<keyword>[</keyword>
</command>

<command name="setpenwidth">
<keyword>taillecrayon</keyword>
<alias>ftc</alias>
</command>

</logokeywords>

Fichier logo.pl

#!/usr/bin/perl -w

# utiliser le module
use XML::Simple;
use Data::Dumper;
use Unicode::String;
use utf8;

# créer un objet
$xml = new XML::Simple ();

# lire le fichier XML
$data = $xml->XMLin("logo2.xml");

# accéder aux données XML
print Dumper ($data);

my $commande=$data->{'command'};
print Dumper ($commande);

foreach my $englogokey (keys (%$commande))
{
print $englogokey."n";

#
# Divers essais pour lire correctement keyword et alias
#

my $frelogokey=%{$commande}->{$englogokey};

print $frelogokey->{'keyword'}."n";
print $frelogokey->{'alias'}."n" if defined ( $frelogokey->{'alias'} );

print %$commande->{$englogokey}->{'keyword'}."n";
print %$commande->{$englogokey}->{'alias'}."n" if defined (
%$commande->{$englogokey}->{'alias'} );
}

exit 0;


Ici apparaissent plusieurs essais de codages qui entraînent des erreurs
comme indiquées dans le Sujet en ligne

Using a hash as a reference is deprecated at ./logo.pl line 24.
Using a hash as a reference is deprecated at ./logo.pl line 28.
Using a hash as a reference is deprecated at ./logo.pl line 29.
Using a hash as a reference is deprecated at ./logo.pl line 29.
Avatar
espie
In article <48dba222$0$14101$,
Nicolas George <nicolas$ wrote:
Paul Gaborit wrote in message :
Le seul effort de déduction demandé au lecteur était d'intuiter que
$data contenait effectivement la structure de données exposée
préalablement et arbitrairement nommé $VAR1 par Data::Dumper...



C'est précisément l'objet de ma question. Si tu commences à faire confiance
aux gens qui postent ici de ne pas faire d'erreurs grotesques de ce genre,
tu n'es pas sorti de l'auberge.



Nicolas, si tu faisais des messages un peu plus complets des le debut,
on ne se retrouverait pas avec des prises de tete dans ce genre.

T'as quand meme reussi a confuser Paul Gaborit, qui n'est quand meme pas
le dernier neuneu du coin... !
Avatar
Paul Gaborit
À (at) Thu, 25 Sep 2008 20:01:18 +0200,
ebrnospam écrivait (wrote):
#
# Divers essais pour lire correctement keyword et alias
#

my $frelogokey=%{$commande}->{$englogokey};



my $frelogokey= $commande->{$englogokey};


print $frelogokey->{'keyword'}."n";
print $frelogokey->{'alias'}."n" if defined ( $frelogokey->{'alias'} );

print %$commande->{$englogokey}->{'keyword'}."n";
print %$commande->{$englogokey}->{'alias'}."n" if defined (%$commande->{$englogokey}->{'alias'} );


print $commande->{$englogokey}->{'keyword'}."n";
print $commande->{$englogokey}->{'alias'}."n" if defined ($commande->{$englogokey}->{'alias'} );

(je n'ai pas essayé le code fourni... mais l'idée est là)

Le préfixe % ne s'utilise que lorsqu'on veut manipuler une table de
hachage dans son ensemble.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>
Avatar
Le Souricier Gris
On 25 sep, 23:26, Paul Gaborit wrote:
À (at) Thu, 25 Sep 2008 20:01:18 +0200,
ebrnospam écrivait (wrote):

> #
> # Divers essais pour lire correctement keyword et alias
> #

> my $frelogokey=%{$commande}->{$englogokey};

my $frelogokey= $commande->{$englogokey};

> print $frelogokey->{'keyword'}."n";
> print $frelogokey->{'alias'}."n" if defined ( $frelogokey->{'alias' } );

> print %$commande->{$englogokey}->{'keyword'}."n";
> print %$commande->{$englogokey}->{'alias'}."n" if defined (%$comman de->{$englogokey}->{'alias'} );

print $commande->{$englogokey}->{'keyword'}."n";
print $commande->{$englogokey}->{'alias'}."n" if defined ($comma nde->{$englogokey}->{'alias'} );

(je n'ai pas essayé le code fourni... mais l'idée est là)

Le préfixe % ne s'utilise que lorsqu'on veut manipuler une table de
hachage dans son ensemble.

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



Merci bien pour l'explication et la correction tout est maintenant
correct.

Problème Résolu.

Eric BERTHOMIER
Avatar
Paul Gaborit
À (at) Fri, 26 Sep 2008 02:27:13 -0700 (PDT),
Le Souricier Gris écrivait (wrote):
On 25 sep, 23:26, Paul Gaborit wrote:
À (at) Thu, 25 Sep 2008 20:01:18 +0200,
ebrnospam écrivait (wrote):

> #
> # Divers essais pour lire correctement keyword et alias
> #

> my $frelogokey=%{$commande}->{$englogokey};

my $frelogokey= $commande->{$englogokey};

> print $frelogokey->{'keyword'}."n";
> print $frelogokey->{'alias'}."n" if defined ( $frelogokey->{'alias'} );

> print %$commande->{$englogokey}->{'keyword'}."n";
> print %$commande->{$englogokey}->{'alias'}."n" if defined (%$commande->{$englogokey}->{'alias'} );

print $commande->{$englogokey}->{'keyword'}."n";
print $commande->{$englogokey}->{'alias'}."n" if defined ($commande->{$englogokey}->{'alias'} );

(je n'ai pas essayé le code fourni... mais l'idée est là)

Le préfixe % ne s'utilise que lorsqu'on veut manipuler une table de
hachage dans son ensemble.

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



Merci bien pour l'explication et la correction tout est maintenant
correct.



Dernières remarques : concernant l'usage de '->', cette flêche est
souvent optionnelle. Et concernant les clés de table de hachage, les
"" ou '' sont optionnelles si la clé est un mot simple. Ainsi, à la
place de :

print $commande->{$englogokey}->{'alias'}."n" if defined ($commande->{$englogokey}->{'alias'} );

On aurait pu écrire :

print "$commande->{$englogokey}{alias}n" if defined $commande->{$englogokey}{alias};


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