OVH Cloud OVH Cloud

Problème de débutant: utiliser @_

13 réponses
Avatar
CrazyCat
Bonjour,

je débute en perl pour faire de petits scripts (pour Irssi) et j'ai un
soucis qui doit sembler ridicule.

j'envoit une chaine de caractères à une sub, laquelle doit prendre le
premier mot comme étant un nom de variable et le reste comme son contenu
(pour faire un fichier de variables).

Par exemple j'envoit "state currently awaiting" et je voudrais mettre
dans mon fichier: "state:currently awaiting"

J'essaye de faire:
sub xa_set() {
my ($key, $xavalue) = @_;
if(!(open xa_settings, ">$xa_confile")) {
&putlog("Unable to create file $xa_confile");
}
print xa_settings "$key:$xavalue";
close xa_settings;
}

Avec ça, je me retrouve avec "state currently
awaiting:Irssi::Irc::Server=HASH(0x8336ca0)" dans le fichier.

Quelqu'un saurait-il comment faire pour que $key contienne le 1er mot et
$xavalue le reste?

J'ai essayé aussi en faisant:
sub xa_set() {
my $key = shift(@_);
my $xavalue = @_;
...
}
qui me ressort: "state currently awaiting:2"

Merci d'avance

--
Aide informatique: http://help-info.forumactif.com
Humour: http://www.chatfou.com
Tchattez en liberté: http://www.crazy-irc.net

10 réponses

1 2
Avatar
Jean-Marc FRIGERIO
CrazyCat wrote:

Bonjour,

je débute en perl pour faire de petits scripts (pour Irssi) et j'ai un
soucis qui doit sembler ridicule.

j'envoit une chaine de caractères à une sub, laquelle doit prendre le
premier mot comme étant un nom de variable et le reste comme son contenu
(pour faire un fichier de variables).

Par exemple j'envoit "state currently awaiting" et je voudrais mettre
dans mon fichier: "state:currently awaiting"

J'essaye de faire:
sub xa_set() {
my ($key, $xavalue) = @_;
if(!(open xa_settings, ">$xa_confile")) {
&putlog("Unable to create file $xa_confile");
}
print xa_settings "$key:$xavalue";
close xa_settings;
}

Avec ça, je me retrouve avec "state currently
awaiting:Irssi::Irc::Server=HASH(0x8336ca0)" dans le fichier.

Quelqu'un saurait-il comment faire pour que $key contienne le 1er mot et
$xavalue le reste?

J'ai essayé aussi en faisant:
sub xa_set() {
my $key = shift(@_);
my $xavalue = @_;
...
}
qui me ressort: "state currently awaiting:2"

Merci d'avance


Salut
sub xa_set() {
my $key = shift;
my @xavalue = @_;
...
}

Avatar
Sébastien Bourgasser
j'envoit une chaine de caractères à une sub, laquelle doit prendre le
premier mot comme étant un nom de variable et le reste comme son contenu
(pour faire un fichier de variables).

Par exemple j'envoit "state currently awaiting" et je voudrais mettre
dans mon fichier: "state:currently awaiting"

J'essaye de faire:
sub xa_set() {
my ($key, $xavalue) = @_;
if(!(open xa_settings, ">$xa_confile")) {
&putlog("Unable to create file $xa_confile");
}
print xa_settings "$key:$xavalue";
close xa_settings;
}



Bonjour,

Si vous n'envoyez qu'un argument, vous ne pourrez avoir qu'un argument.
Il faudrait appeler xa_set() avec 2 arguments du style:
xa_set('state', 'currently awaiting');

Toutefois pour n'utiliser qu'un seul argument, si son format est
toujours identique, une regexp vous suffira;

sub xa_set() {
my ($key, $xavalue) = shift =~ /^(S+) (.*)/

# open ...
print xa_settings "$key:$xavalue";
}

A+

--
Séb

Avatar
Dam
Si tu appelles comme ça :
xa_set("state currently awaiting");

sub xa_set($) {
my $param = shift(@_);
my $key = $param;
$key =~ s/(w+)s+(.*)/$1/;
my $xavalue = $2;

if(!(open xa_settings, ">$xa_confile")) {
&putlog("Unable to create file $xa_confile");
}
print xa_settings "$key:$xavalue";
close xa_settings;
}


C'est correct?
Avatar
Dam
avec un appel avec 2 arguements
xa_set('state', 'currently awaiting');

Tu peux aussi faire ça :
sub xa_set($ $) {
my $key = shift(@_);
my $xavalue = shift(@_);
if(!(open xa_settings, ">$xa_confile")) {
&putlog("Unable to create file $xa_confile");
}
print xa_settings "$key:$xavalue";
close xa_settings;
}
Avatar
Sébastien Bourgasser

C'est correct?



C'est lourd et compliqué plutôt :-)

A+

--
Séb

Avatar
CrazyCat
Sébastien Bourgasser wrote:
Toutefois pour n'utiliser qu'un seul argument, si son format est
toujours identique, une regexp vous suffira;
sub xa_set() {
my ($key, $xavalue) = shift =~ /^(S+) (.*)/


Effectivement, ça marche parfaitement.
En fait, ma sub reçoit trois arguments mais je ne maitrise que le
premier, donc je gère comme si je n'en avais qu'un.

J'avais bien tenté avec les regexp mais comme je ne maitrise pas perl,
c'est vite devenu calamiteux.
Heureusement, au fur et à mesure je prend mes marques.

Merci bien :)

--
Aide informatique: http://help-info.forumactif.com
Humour: http://www.chatfou.com
Tchattez en liberté: http://www.crazy-irc.net

Avatar
Dam
lourd? Personnellement, j'ai tendance à l'éclater les instructions
afin que ce soit le plus clair possible. C'est également bien plus
maintenable qu'avec un truc du style :
"my ($key, $xavalue) = shift =~ /^(S+) (.*)/ "

Enfin bon, chacun son style de programmation ;)
Avatar
CrazyCat
Désolé mais je ne teste pas, la solution de Sébastien m'allant
parfaitement et étant, amha, plus simple.
Par contre, je garde ton code sous la main à titre d'exemple de
possibilités.

Merci bien


--
Aide informatique: http://help-info.forumactif.com
Humour: http://www.chatfou.com
Tchattez en liberté: http://www.crazy-irc.net
Avatar
Sébastien Bourgasser
lourd? Personnellement, j'ai tendance à l'éclater les instructions
afin que ce soit le plus clair possible. C'est également bien plus
maintenable qu'avec un truc du style :
"my ($key, $xavalue) = shift =~ /^(S+) (.*)/ "

Enfin bon, chacun son style de programmation ;)



Effectivement chacun son style. Maintenant on peut peut-être lancer le
troll de la semaine. Perso je préfère 1 ligne très simple à comprendre
(c'est la base) que 4 lignes. Niveau maintenance, ça me parait plus
simple également :)

A+

--
Séb

Avatar
Paul Gaborit
À (at) 10 Jan 2006 06:55:47 -0800,
"Dam" écrivait (wrote):
Si tu appelles comme ça :
xa_set("state currently awaiting");


On peut aussi utiliser 'split' et son paramètre LIMIT (ici il faut
utiliser 2) :

sub xa_set {
my $str = shift;
my ($key, $value) = split ' ', $str, 2;

# ...
print "$key: $valuen";

}

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

1 2