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

opérateur ternaire et affectation de variable

3 réponses
Avatar
ctemp1
Bonjour,

J'ai un problème avec l'opérateur ternaire.

Voici un exemple :

#!/usr/bin/perl -w

use strict;

my $indice;

# dans le cas d'un test sur les lignes d'un fichier
while(<>){
$_ =~ /riboso/ ? $indice = 'oui' : $indice = 'non';
if ($indice eq 'oui')
...
else
...
}

A ce niveau, que la chaîne 'riboso' soit présente ou pas dans les
lignes, $indice n'est pas affectée.
En revanche :
$_ =~ /riboso/ ? print "OK\n" : print "non\n";
fonctionne parfaitement.

Pouvez-vous me dire pourquoi dans le cas de l'opérateur ternaire
$indice n'est pas affectée ?

Je vous remercie.

C. Tobini

3 réponses

Avatar
Laurent Wacrenier
C. Tobini écrit:
$_ =~ /riboso/ ? $indice = 'oui' : $indice = 'non';


Ce serait plutôt :
$indice = $_ =~ /riboso/ ? 'oui' : 'non';

if ($indice eq 'oui')
...
else
...
}

A ce niveau, que la chaîne 'riboso' soit présente ou pas dans les
lignes, $indice n'est pas affectée.
En revanche :
$_ =~ /riboso/ ? print "OKn" : print "nonn";
fonctionne parfaitement.


Mais c'est aussi sale.

Pouvez-vous me dire pourquoi dans le cas de l'opérateur ternaire
$indice n'est pas affectée ?


Les priorités ne sont pas les mêmes.

Évite de faire des affectations à l'interieur de l'opérateur.
Il n'a pas été conçu pour ça.

Avatar
Scetbon Cyril
Problème de priorité :

test.pl:
--------
my $indice;
1==1 ? $indice = 'oui' : $indice = 'non';
print "indice=$indice",$/;
1==1 ? ($indice = 'oui') : ($indice = 'non');
print "indice=$indice",$/;

perl test.pl
indice=non
indice=oui


C. Tobini wrote:
Bonjour,

J'ai un problème avec l'opérateur ternaire.

Voici un exemple :

#!/usr/bin/perl -w

use strict;

my $indice;

# dans le cas d'un test sur les lignes d'un fichier
while(<>){
$_ =~ /riboso/ ? $indice = 'oui' : $indice = 'non';
if ($indice eq 'oui')
...
else
...
}

A ce niveau, que la chaîne 'riboso' soit présente ou pas dans les
lignes, $indice n'est pas affectée.
En revanche :
$_ =~ /riboso/ ? print "OKn" : print "nonn";
fonctionne parfaitement.

Pouvez-vous me dire pourquoi dans le cas de l'opérateur ternaire
$indice n'est pas affectée ?

Je vous remercie.

C. Tobini


Avatar
C. Tobini
Bonjour et merci de ta réponse,

Laurent Wacrenier wrote:
Ce serait plutôt :
$indice = $_ =~ /riboso/ ? 'oui' : 'non';


En fait non car dans ce que je voudrais faire, $indice est une variable
globale affectée en fonction du contenu des lignes du fichier lu par
while(<>).

C. Tobini