Création d'une variable avec un "print" | Perl [Résolu/Fermé]

Signaler
Messages postés
9
Date d'inscription
lundi 30 septembre 2013
Statut
Membre
Dernière intervention
29 janvier 2014
-
Messages postés
9
Date d'inscription
lundi 30 septembre 2013
Statut
Membre
Dernière intervention
29 janvier 2014
-
Bonjour tout le monde,

Tout d'abords j'avouerai que je suis un total débutant et qu'il serait cool de me rectifier si je viens à utiliser un mot ou une expression fausse.

Mon souci est que je souhaite créer un tableau (array) qui prend le résultat d'une condition if. Je vous montre.

if (grep {$community eq $_ } @communities)  {
#Si on trouve des données de $community égales à celles de @communities alors
print "$community;$login;$last_at;;$size;1\n";
push (@matchs, $community_matchs);
}

Ensuite j'utilise le tableau @matchs pour le re-comparer avec le tableau @communities.

if (grep {@communities ne $_) @matchs) {
print "$community;3\n";

Mon tableau @matchs est déclaré au début du "sub" mais est vide, ce qui donne un résultat faussé.

Il n'est pas facile de l'expliquer correctement (tout du moins pour moi), mais je serais prêt à donner plus d'information si nécessaire.

Merci d'avance pour votre aide.

2 réponses

Messages postés
5550
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
12 mai 2021
934
Salut Matarela,

J'ai deux questions (1. et 2. ci-dessous), et un exemple de code pour toi (3.).

Je m'arrête au 1er bout de ton code pour le moment :
if (grep {$community eq $_ } @communities)  {
.

1.

Utilisé de cette façon, grep va passer en revue les éléments du tableau @communities et tester ce qui est dans le block, mettre chaque élément dans $_ et effectuer le test {$community eq $_ }.

Est-ce vraiment cela que tu veux faire : tester que la chaîne $_ (chaque élément du tableau) est égale à la chaîne $community ?

Ton commentaire semble indiquer autre chose.

2.

if (grep {$community eq $_ } @communities)  {
va retourner vrai si au moins un élément remplit la condition.

Cependant :

- tu n'auras pas la liste de ces éléments
- ce qui suit le if ne sera exécuté qu'une fois, si au moins un élément remplit la condition

Plus loin, tu utilises @matchs dans un push où tu mets le contenu de $community_matchs.

Qu'est-ce que $community_matchs est sensée contenir ?

Quel est le rapport avec les résultats du grep ?

Au final, pour y voir plus clair, je crois qu'il faudrait un exemple de données de départ et de ce que tu veux.

Peux-tu donner un tel exemple, stp ?

3.

Sinon, voilà un exemple d'usage de grep comme tu le fais :

#!/usr/bin/perl

use strict;
use warnings;

my $community = "men";
my @communities = qw(elves dwarves men hobbits ents);
my ($login,$last_at,$size);
my @matchs;
my $community_matchs;

$login = "toto";
$last_at = "truc";
$size = "pas bien gros";

if (grep {$community eq $_ } @communities) {
# Si on trouve des $community dans @communities alors
print "$community;$login;$last_at;;$size;1\n";
# j'ignore ce qu'est sensée faire la ligne suivante,
push (@matchs, $community_matchs);
}

Cela affiche :

men;toto;truc;;pas bien gros;1

Dal
Messages postés
5550
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
12 mai 2021
934
J'ajouterai que cette utilisation du grep de Perl est assez peu lisible.

Le grep de Perl retourne un tableau.

https://perldoc.perl.org/functions/grep

Là, le tableau n'est pas affecté et est implicitement évalué dans un contexte scalaire dans ton if.

C'est du Perl tout à fait valable, puisque si le tableau est vide le if est évalué à faux, s'il contient des données le tableau sera évalué à son nombre d'éléments (une valeur non nulle étant "vrai" en Perl). Mais on fait mieux en termes de lisibilité... et j'ai comme dans l'idée que ce n'est pas ce que tu veux faire, en fait, non seulement ce niveau, mais aussi au niveau du test.

Comme demandé, pour y voir plus clair, il faudrait un exemple de données de départ et de ce que tu veux.


Dal
Messages postés
9
Date d'inscription
lundi 30 septembre 2013
Statut
Membre
Dernière intervention
29 janvier 2014

Merci beaucoup Dal, tu m'as un peu aidé même si j'ai trouvé la solution toute seule.

Bonne continuation Matarela.