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
C'est expr�s que la variable n'a pas le m�me nom les deux fois�?
En esp�rant avoir r�pondu � votre question.
Eric
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�:
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/>
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 !
;-)
--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>
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).
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 ?
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).
--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>
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 ? ;-)
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.
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.
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.
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... !
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.
Merci bien pour l'explication et la correction tout est maintenant
correct.
Problème Résolu.
Eric BERTHOMIER
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};