Perl: transformer un fichier en package
Résolu/Fermé
JamieMacUloth
Messages postés
43
Date d'inscription
jeudi 16 février 2017
Statut
Membre
Dernière intervention
6 juin 2022
-
13 mars 2017 à 10:26
JamieMacUloth Messages postés 43 Date d'inscription jeudi 16 février 2017 Statut Membre Dernière intervention 6 juin 2022 - 24 mars 2017 à 10:59
JamieMacUloth Messages postés 43 Date d'inscription jeudi 16 février 2017 Statut Membre Dernière intervention 6 juin 2022 - 24 mars 2017 à 10:59
A voir également:
- Perl: transformer un fichier en package
- Denon perl pro test - Accueil - Audio
- Active perl - Télécharger - Édition & Programmation
- PERL -- liste - Forum Perl
- Perl foreach ✓ - Forum Perl
- Perl substitution ✓ - Forum Perl
1 réponse
[Dal]
Messages postés
6194
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
11 octobre 2024
1 092
13 mars 2017 à 19:20
13 mars 2017 à 19:20
Salut,
Tu peux utiliser le délimiteur
Comme dans cet exemple :
https://forums.commentcamarche.net/forum/affich-32266192-reorganisations-de-donnees-dans-un-fichier-en-perl#3
La doc Perl :
https://perldoc.perl.org/perldata#Special-Literals
https://perldoc.perl.org/SelfLoader#The-__DATA__-token
Dal
Tu peux utiliser le délimiteur
__DATA__marquant la fin du programme à compiler sur un fichier Perl donné et le début de données accessibles par le filehandle
<DATA>...
Comme dans cet exemple :
https://forums.commentcamarche.net/forum/affich-32266192-reorganisations-de-donnees-dans-un-fichier-en-perl#3
La doc Perl :
https://perldoc.perl.org/perldata#Special-Literals
https://perldoc.perl.org/SelfLoader#The-__DATA__-token
Dal
18 mars 2017 à 15:06
Merci pour ces infos. En fait, ma question était mal posée. Je souhaite en fait pas charger un fichier, mais garder en mémoire un array qui a été généré par un programme.
Imaginons qu'un programme génère un tableau, par exemple:
$arr[0]="tutu";$arr[1]="titi";$arr[2]="toto";
Y a t-il un moyen que ce tableau soit sauvegardé, de façon qu'un second programme l'exploite?
Modifié par [Dal] le 20/03/2017 à 10:42
Pour cela, tu as un module standard Storable : https://perldoc.perl.org/Storable
Il y a d'autres façons de faire, Gabor Szabo en parle dans cet article : https://perlmaven.com/data-serialization-in-perl
Les solutions du type Data::Dumper, nécessitent le stockage dans un fichier.pl qui serait évalué ensuite avec une directive du type par exemple (ou do, ou use). Gabor, déconseille ce type de solution pour des raisons de sécurité (en particulier, si le contenu des données stockées est susceptible d'être altéré par l'utilisateur et n'est pas contrôlé).
Dal
20 mars 2017 à 13:49
Malheureusement, je suis longue à la détente
Effectivement, j'approche de ce que je cherche à faire avec notamment Storable. Mais seulement voilà. Ce petit code marche:
use Storable;
my @a = (1, 2, 3);
store(\@a, "array.dat");
my @a2 = @{retrieve("array.dat")};
print("a2[1] = $a2[1]\n");
Le problème est que je dépends d'un .dat
J'aimerais ne pas dépendre d'un fichier. Peut-être que je fais fausse route Dal, mais voilà: mon but est de créer un exécutable à partir de mon code Perl TK .pl. Tu me diras, quel rapport avec notre sujet? En fait, je travaille avec un dictionnaire de mots: dico.txt.
Mon programme .pl charge ce fichier et stocke ces mots dans un array @dico. Si je pouvais sauvegarder ce @dico en interne dans Perl, je pensais que ce serait bien. De ce que je comprends de Storable, c'est que je réécris @dico dans un fichier .dat. Ce qui ne m'avance pas beaucoup.
Apparemment, on peut sauvegarder des contenus de variables dans des ... variables via freeze et thaw mais j'ai essayé ce code qui ne fonctionne pas:
use Storable qw(store retrieve freeze thaw dclone);
my @a = (1, 2, 3);
my $str = freeze(\@a);
print ("str = $str\n");
my @a2 = thaw($str);
print("a2[0] = $a2[0]\n");
Mais à la console je vois:
str = °1234µ$++) (des caractères bizarres)
a2[0] = ARRAY<0x60e2bc>
En fait j'ai 2 problèmes (peut-être que la réponse du 2nd ne nécessite pas de me prendre la tête sur le 1er)
1) Est-il possible de stocker un array non pas dans un .dat mais dans une mémoire liée à Perl, de sorte que si j'éteins/rallume mon ordi, par n'importe quel programme .pl, je puisse reloader cet array?
2) Est-il possible de créer un exécutable qui embarque dedans les données de .dat? Car si c'est le cas, j'ai même pas besoin de résoudre mon problème de sérialisation. Car en ce cas, l'exe contiendrait déjà en lui-même les data du .dat. Mais là encore je suis un peu perdue: il faut bien une ligne de code pour charger le .dat, mais ce que je veux, c'est justement m'affranchir du .dat lorsque je passe en exe. Du coup, comment faire comprendre à l'exe de chercher le .dat alors que je souhaite en être indépendante?
Merci beaucoup Dal, je ne sais pas si tu pourras un peu m'aiguiller, même si tu as déjà fait beaucoup pour m'aider
20 mars 2017 à 16:23
Perl est un interpréteur. Un interpréteur est un programme comme une autre. Lorsqu'il a terminé de s'exécuter, il disparaît de la mémoire, avec la mémoire qu'il gère.
2) Est-il possible de créer un exécutable qui embarque dedans les données de .dat?
Je n'ai jamais utilisé de packageur pour créer un .exe, mais à ce que je vois ils sont effectivement capables de packager les scripts et leurs dépendances (y compris, d'ailleurs, les modules sur le fonctionnement duquel ils reposent, permettant ainsi une distribution sans avoir à installer Perl, mettre à jour CPAN, etc.).
Maintenant, si le programme, à l'exécution, va modifier le contenu de ton "dictionnaire" et que ce contenu doit être sauvegardé, je ne vois pas trop comment tu vas faire autrement qu'en le ... sauvegardant :-)
Une autre façon de faire est de mettre tes données dans une base de données, géré par un serveur de gestion de base de données, et d'intéragir avec Perl pour effectuer tes requêtes dessus. Ainsi, la mémorisation des données est gérée par le SGBD.
https://dbi.perl.org/
24 mars 2017 à 10:59
Encore merci pour tes explications claires et ton expérience !!