Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Using a hash as a reference is deprecated

0 views
Skip to first unread message

Le Souricier Gris

unread,
Sep 24, 2008, 4:18:40 PM9/24/08
to
Bonjour,

afin de progresser dans ma compréhension du PERL, je cherche à savoir
comment corriger le problème :
Using a hash as a reference is deprecated

La structure de données que je désire utilisée est celle-ci (affichée
à l'aide de Dumper) :
$VAR1 = {
'lang' => 'fr_FR',
'ver' => '0.01',
'command' => {
'setpenwidth' => {
'keyword' => 'taillecrayon',
'alias' => 'ftc'
},
'begin' => {
'keyword' => '['
}
}
};

Aussi, afin de récupérer les éléments, j'ai écrit le code suivant :

my $commande=$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épréciée ?

Merci

Nicolas George

unread,
Sep 24, 2008, 4:38:18 PM9/24/08
to
Le Souricier Gris wrote in message
<ddf90d94-50b6-4028...@x35g2000hsb.googlegroups.com>:
> $VAR1 = {
> my $commande=$data->{'command'};

C'est expr�s que la variable n'a pas le m�me nom les deux fois�?

ebrnospam

unread,
Sep 24, 2008, 4:54:53 PM9/24/08
to
Nicolas George a �crit :
$VAR1 est une variable utilis�e par DUMPER, aucun rapport avec une
quelconque programmation.

En esp�rant avoir r�pondu � votre question.

Eric

Nicolas George

unread,
Sep 24, 2008, 5:16:35 PM9/24/08
to
ebrnospam wrote in message <48daa91e$0$4587$426a...@news.free.fr>:

> $VAR1 est une variable utilis�e par DUMPER, aucun rapport avec une
> quelconque programmation.

Je sais. Et si elle s'appelle $VAR1, elle ne s'appelle pas $data, donc si on
l'appelle $data, �a ne marche pas. Donc je re-pose la question�:

Paul Gaborit

unread,
Sep 24, 2008, 5:15:22 PM9/24/08
to

� (at) Wed, 24 Sep 2008 13:18:40 -0700 (PDT),
Le Souricier Gris <lesouri...@gmail.com> �crivait (wrote):
> afin de progresser dans ma compr�hension du PERL, je cherche � savoir
> comment corriger le probl�me :

> Using a hash as a reference is deprecated

Sur quelle ligne de votre code se produit ce message ?
Avec quelle version de Perl ?

> Quelqu'un pourrait t'il me corriger et tenter de m'expliquer cette

> syntaxe d�pr�ci�e ?

Chez moi, le code ci-dessou ne produit ni message d'erreur ni message
d'avertissement. Il affiche juste 'setpenwidth' et 'begin'.

################
#!/usr/bin/perl -w
use strict;
use warnings;

my $data =


{
lang => 'fr_FR',
ver => '0.01',
command => {
setpenwidth => {
keyword => 'taillecrayon',
alias => 'ftc'
},
begin => {
keyword => '['

},
},
};

my $commande = $data->{command};

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


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

Paul Gaborit

unread,
Sep 24, 2008, 5:33:35 PM9/24/08
to

À (at) 24 Sep 2008 21:16:35 GMT,
Nicolas George <nicolas$geo...@salle-s.org> écrivait (wrote):

> ebrnospam wrote in message <48daa91e$0$4587$426a...@news.free.fr>:
>> $VAR1 est une variable utilisée par DUMPER, aucun rapport avec une

>> quelconque programmation.
>
> Je sais. Et si elle s'appelle $VAR1, elle ne s'appelle pas $data, donc si on
> l'appelle $data, ça ne marche pas. Donc je re-pose la question :
>
>>> C'est exprès que la variable n'a pas le même nom les deux fois ?

Data::Dumper ne connait pas le nom associé à la valeur qu'on lui
demande d'afficher. Il affiche donc un nom générique ($VAR1) qui ne
préjuge en rien du nom (ou de l'un des noms) réellement utilisé dans
le code. Et le PO indique bien que ce n'est pas du code mais la sortie
d'un appel à Data::Dumper... Donc tout cela me semble très clair !

;-)

Perl en français - <http://perl.enstimac.fr/>

Le Souricier Gris

unread,
Sep 25, 2008, 4:02:40 AM9/25/08
to
On 24 sep, 23:15, Paul Gaborit <Paul.Gabo...@invalid.invalid> wrote:
> (at) Wed, 24 Sep 2008 13:18:40 -0700 (PDT),
> Le Souricier Gris <lesouricierg...@gmail.com> crivait (wrote):

Sur un autre pote, la version est :
This is perl, v5.8.8 built for i486-linux-gnu-thread-multi

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).

Nicolas George

unread,
Sep 25, 2008, 4:36:15 AM9/25/08
to
Paul Gaborit wrote in message <wt9myhx...@marceau.enstimac.fr>:

> Data::Dumper ne connait pas le nom associé à la valeur qu'on lui
> demande d'afficher. Il affiche donc un nom générique ($VAR1) qui ne
> préjuge en rien du nom (ou de l'un des noms) réellement utilisé dans
> le code. Et le PO indique bien que ce n'est pas du code mais la sortie
> d'un appel à Data::Dumper... Donc tout cela me semble très clair !

Oui, je sais lire.

Ce que je lui demande, c'est pourquoi cette variable qui s'appelle $VAR1,
trois ligne plus bas il l'appelle $data. C'est si compliqué à comprendre que
quand on n'utilise pas le même nom pour la même variable, en général ça ne
marche pas ?

Paul Gaborit

unread,
Sep 25, 2008, 8:49:16 AM9/25/08
to

À (at) Thu, 25 Sep 2008 01:02:40 -0700 (PDT),
Le Souricier Gris <lesouri...@gmail.com> écrivait (wrote):

> On 24 sep, 23:15, Paul Gaborit <Paul.Gabo...@invalid.invalid> 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).

Perl en français - <http://perl.enstimac.fr/>

Paul Gaborit

unread,
Sep 25, 2008, 9:09:44 AM9/25/08
to

À (at) 25 Sep 2008 08:36:15 GMT,

Nicolas George <nicolas$geo...@salle-s.org> écrivait (wrote):

Est-ce si compliqué de comprendre que les deux bouts de code (le
premier bout n'en étant pas un mais un simple affichage) n'ont rien à
voir entre eux si ce n'est que l'un permet d'exposer une structure de
données utilisée par l'autre ?

Est-ce si compliqué de comprendre qu'il n'existe aucune variable
nommée $VAR1 ?

Est-ce si compliqué de comprendre que le bout de code affiché par
Data::Dumper n'est jamais utilisé ?

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...
Est-ce si compliqué à déduire ? ;-)

Nicolas George

unread,
Sep 25, 2008, 10:37:22 AM9/25/08
to
Paul Gaborit wrote in message <wt9fxno...@marceau.enstimac.fr>:

> 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.

ebrnospam

unread,
Sep 25, 2008, 2:00:56 PM9/25/08
to Paul.Gab...@enstimac.fr
Paul Gaborit a écrit :

> À (at) Thu, 25 Sep 2008 01:02:40 -0700 (PDT),
> Le Souricier Gris <lesouri...@gmail.com> écrivait (wrote):
>> On 24 sep, 23:15, Paul Gaborit <Paul.Gabo...@invalid.invalid> 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.

ebrnospam

unread,
Sep 25, 2008, 2:01:18 PM9/25/08
to Paul.Gab...@enstimac.fr
Paul Gaborit a écrit :

> À (at) Thu, 25 Sep 2008 01:02:40 -0700 (PDT),
> Le Souricier Gris <lesouri...@gmail.com> écrivait (wrote):
>> On 24 sep, 23:15, Paul Gaborit <Paul.Gabo...@invalid.invalid> 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

</logokeywords>

Fichier logo.pl

#!/usr/bin/perl -w

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.

Marc Espie

unread,
Sep 25, 2008, 4:44:32 PM9/25/08
to
In article <48dba222$0$14101$426a...@news.free.fr>,

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... !

Paul Gaborit

unread,
Sep 25, 2008, 5:26:13 PM9/25/08
to

À (at) Thu, 25 Sep 2008 20:01:18 +0200,
ebrnospam <ebrn...@free.fr> é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.

Le Souricier Gris

unread,
Sep 26, 2008, 5:27:13 AM9/26/08
to
On 25 sep, 23:26, Paul Gaborit <Paul.Gabo...@invalid.invalid> wrote:
> À (at) Thu, 25 Sep 2008 20:01:18 +0200,
> ebrnospam <ebrnos...@free.fr> écrivait (wrote):

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

Problème Résolu.

Eric BERTHOMIER

Paul Gaborit

unread,
Sep 26, 2008, 8:08:33 AM9/26/08
to

À (at) Fri, 26 Sep 2008 02:27:13 -0700 (PDT),

Le Souricier Gris <lesouri...@gmail.com> écrivait (wrote):

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};

0 new messages