Perl: transformer un fichier en package [Résolu/Fermé]

Signaler
Messages postés
33
Date d'inscription
jeudi 16 février 2017
Statut
Membre
Dernière intervention
4 avril 2021
-
Messages postés
33
Date d'inscription
jeudi 16 février 2017
Statut
Membre
Dernière intervention
4 avril 2021
-
Salut,

Je suis face à un nouveau problème dans un programme que j'essaie de réaliser: alors voilà, j'ai par exemple un fichier txt contenant:
titi
toto
tutu
tata
Je voudrais savoir s'il y a un moyen qu'au lieu de charger le fichier txt et de récupérer les mots qu'il contient, on pouvait transformer le fichier en un package ou quelque chose qui permet d'être intégré à Perl.
Pourquoi je pose la question: parce que j'aimerais faire un .exe et que j'aimerais que le programme tourne sans qu'il soit nécessaire de charger le fichier, mais que son contenu soit déjà mémorisé dans un package interne Perl.
Est-ce que c'est possible et est-ce que quelqu'un peut m'aider en me donnant quelques conseils?
Merci beaucoup d'avance :)

1 réponse

Messages postés
5547
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
11 mai 2021
933
Salut,

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
Messages postés
33
Date d'inscription
jeudi 16 février 2017
Statut
Membre
Dernière intervention
4 avril 2021

Bonjour Dal,

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?
Messages postés
5547
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
11 mai 2021
933
Ah, tu veux faire de la sérialisation de structures de données Perl.

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
require "/chemin/vers/fichier.pl";
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
Messages postés
33
Date d'inscription
jeudi 16 février 2017
Statut
Membre
Dernière intervention
4 avril 2021

Merci encore Dal!
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
Messages postés
5547
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
11 mai 2021
933
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?

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/
Messages postés
33
Date d'inscription
jeudi 16 février 2017
Statut
Membre
Dernière intervention
4 avril 2021

Merci Dal, effectivement, je dois creuser ce point. C'est plutôt vers DBI que je vais du coup m'orienter.
Encore merci pour tes explications claires et ton expérience !!