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

utilisation de system

2 réponses
Avatar
GuiGui
Bonjour,


J'ai un petit souci avec la commande system.

J'ai testé ça :

-----------------------------
#!/usr/bin/perl

my @prog = ('lynx','-dump -force_html test.html > test.txt');
system(@prog) == 0 or die "system @prog failed $? \n";
open(TMP, "test.txt") or die "Impossible d'ouvrir le fichier test.txt\n";
my @str = <TMP>;
print @str;

-----------------------------

Le problème est que j'obtiens simplement l'exécution de lynx sans aucun
argument et pas comme je pensais le résultat de la commande :
lynx -dump -force_html test.html > test.txt

J'ai fait une erreur, c'est certain, mais où ?

2 réponses

Avatar
Paul Gaborit
À (at) Wed, 02 Jul 2008 22:51:28 +0200,
GuiGui écrivait (wrote):
J'ai un petit souci avec la commande system.

J'ai testé ça :

-----------------------------
#!/usr/bin/perl

my @prog = ('lynx','-dump -force_html test.html > test.txt');
system(@prog) == 0 or die "system @prog failed $? n";
open(TMP, "test.txt") or die "Impossible d'ouvrir le fichier test.txtn";
my @str = <TMP>;
print @str;

-----------------------------

Le problème est que j'obtiens simplement l'exécution de lynx sans aucun
argument et pas comme je pensais le résultat de la commande :
lynx -dump -force_html test.html > test.txt

J'ai fait une erreur, c'est certain, mais où ?



Tel que vous l'avez écrit, 'lynx' doit être appelé avec un seul et
unique argument qui contient '-dump -force_html test.html > test.txt'...

Vous pourriez éventuellement séparer chaque argument dans un tableau
mais il resterait encore le problème de la redirection qui, telle que
vous l'écrivez, nécessite absolument le passage par un 'shell' ce qui
pose ensuite des problème d'interprétation des arguments par ce
'shell' avant l'appel réel de 'lynx'.

En fait, la bonne solution dans ce cas, consiste à utiliser 'open' :

open my $resfh, "-|", 'lynx', '-dump', '-force_html', 'test.html'
or die "can't execute 'lynx': $!n";
my @str = <$resfh>;
close $resfh;

Pour en savoir plus :

perldoc -f open

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


Tel que vous l'avez écrit, 'lynx' doit être appelé avec un seul et
unique argument qui contient '-dump -force_html test.html > test.txt'...

Vous pourriez éventuellement séparer chaque argument dans un tableau
mais il resterait encore le problème de la redirection qui, telle que
vous l'écrivez, nécessite absolument le passage par un 'shell' ce qui
pose ensuite des problème d'interprétation des arguments par ce
'shell' avant l'appel réel de 'lynx'.




Ok.

En fait, la bonne solution dans ce cas, consiste à utiliser 'open' :

open my $resfh, "-|", 'lynx', '-dump', '-force_html', 'test.html'
or die "can't execute 'lynx': $!n";
my @str = <$resfh>;
close $resfh;

Pour en savoir plus :

perldoc -f open




J'y vois plus clair maintenant. Je débute, et je n'avais jamais utilisé
open avec plus de 3 arguments ( open VAR, mode, nomfichier ).