OVH Cloud OVH Cloud

script & ?

18 réponses
Avatar
ptilou
Bonjour,

Je comprend pas pourquoi quand je passe *.hex en argument, il
n'=E9xecute que le script pour le le premier fichier rencontrer et non
tous ?

#!/usr/bin/perl -w
$a =3D $ARGV[0];
open (IN, "< $a" );
open (OUT, ">out.tmp" );
$cpt=3D0;
while ($line =3D <IN> ) {
if ($line =3D~ /8001/)
{
$cpt++;
print OUT $line;
close OUT;
open (OUT, ">out.tmp");
}
else
{
$b =3D "$cpt$a";
print OUT $line;
rename "out.tmp", $b;
}
}
close OUT;

J'ai essaye en l'appellent par un bash-script la j'ai l'erreur mais sa
va pas il fait un fichier puis pour l'autre il ne le termine pas
il affiche =E7a :
print() on closed filehandle OUT at ./v2cut-1.pl line 17, <IN> line
le script :
#!/bin/bash
function f_pdf2text {
v2cut-1.pl "$0"
}
{
find . -type f -name "*.hex" -maxdepth 1
echo "EOF"
} | {
while true; do
read -r i
f_pdf2text "$i"
test "$i" =3D "EOF" && break
done
}

Mer=E7i

Ptilou

10 réponses

1 2
Avatar
Jacques Caron
Salut,

On 25 Jun 2005 09:48:02 -0700, wrote:

Je comprend pas pourquoi quand je passe *.hex en argument, il
n'éxecute que le script pour le le premier fichier rencontrer et non
tous ?

#!/usr/bin/perl -w
$a = $ARGV[0];
[...]


D'abord parce que ton shell fait l'expansion (à moins que tu aies quoté ou
escapé le *), donc ton script reçoit tous les noms de fichier en
arguments, mais n'utilise que le premier.

Ensuite parce que même si ton script recevait "*.hex" et pas le nom du
premier fichier, je ne vois pas ce qui dans ton script le pousserait à
traiter tous les fichiers portant ce nom un par un, il n'y a aucune boucle
sur le fichier...

Jacques.

Avatar
ptilou
Bonjour,

Jacques Caron wrote:
Salut,

On 25 Jun 2005 09:48:02 -0700, wrote:

Je comprend pas pourquoi quand je passe *.hex en argument, il
n'éxecute que le script pour le le premier fichier rencontrer et non
tous ?

#!/usr/bin/perl -w
$a = $ARGV[0];
[...]


D'abord parce que ton shell fait l'expansion (à moins que tu aies quot é ou
escapé le *), donc ton script reçoit tous les noms de fichier en
arguments, mais n'utilise que le premier.



Je dois remplacer $ARGV[0] par @ARGV et metre une boucle ?

Ensuite parce que même si ton script recevait "*.hex" et pas le nom du
premier fichier, je ne vois pas ce qui dans ton script le pousserait à
traiter tous les fichiers portant ce nom un par un, il n'y a aucune boucle
sur le fichier...



Oui, mais pourquoi, marche pas avec le bash ?

Merçi

Ptilou


Avatar
Jacques Caron
On 25 Jun 2005 22:41:16 -0700, wrote:

Je dois remplacer $ARGV[0] par @ARGV et metre une boucle ?


Oui, par exemple for my $a (@ARGV) { et ne pas oublier de refermer le } à
la fin.

Oui, mais pourquoi, marche pas avec le bash ?


Je ne sais pas, il faudrait que tu rajoutes des tests sur tes open genre
open ">out.tmp" or die "erreur ouverture out.tmp: $!", ça t'en dira plus.

Au passage, dans ton script bash, il y a plus simple que ton pipe
compliqué, tu peux faire un find . -name *.hex -exec script {} ;

Le {} sera remplacé par le nom du fichier à chaque invocation.

Jacques.

Avatar
ptilou
Bonjour,

Jacques Caron wrote:
On 25 Jun 2005 22:41:16 -0700, wrote:

Je dois remplacer $ARGV[0] par @ARGV et metre une boucle ?


Oui, par exemple for my $a (@ARGV) { et ne pas oublier de refermer le } à
la fin.

Oui, mais pourquoi, marche pas avec le bash ?


Je ne sais pas, il faudrait que tu rajoutes des tests sur tes open genre
open ">out.tmp" or die "erreur ouverture out.tmp: $!", ça t'en dira plu s.

Au passage, dans ton script bash, il y a plus simple que ton pipe
compliqué, tu peux faire un find . -name *.hex -exec script {} ;

Le {} sera remplacé par le nom du fichier à chaque invocation.


Moi j'ai copie ça pour bash :
find . -type f -name "*.pdf" -maxdepth 1 -exec mon_script '{}' ';'
Marche pas, il envoie pas les fichiers ...


Ptilou


Avatar
DoMinix


Oui, mais pourquoi, marche pas avec le bash ?



ca marche tres bien, ca fait ce que ca devrait.

--
dominix

Avatar
ptilou
Bonjour,



Oui, mais pourquoi, marche pas avec le bash ?



ca marche tres bien, ca fait ce que ca devrait.



Non, mais je crois que le script bash est bien et c'est le perl qui
pose probléme !

Suis je obligé de passer par un opendir ? (Et abandonner mon script
bash )

J'ai essayé, sans succer d'ajouté :

open dir (DIR, $_ )|| die "le path ?";
#Marce pas !
@ARGV = $_;
foreach (@ARGV){
&cut-couleur };

sub cut-couleur {
$a=$ARGV[0];
open (IN, "< $a" )|| die "(pas bien !)";
open (OUT, ">out.tmp" ) || die "pas ouvert";
$cpt=1;
while ($line = <IN> ) {
if ($line =~ /8001/o)
{
$cpt++;
print OUT $line;
close OUT;
open (OUT, ">out.tmp");
}
else
{
$b = "$cpt$a";
print OUT $line;
rename "out.tmp", $b;
}
}
close OUT;
close IN;}

Merci

Ptilou


Avatar
Paul Gaborit
À (at) 27 Jun 2005 00:44:05 -0700,
écrivait (wrote):
[...]
Suis je obligé de passer par un opendir ? (Et abandonner mon script
~~~~~~~


[...]
open dir (DIR, $_ )|| die "le path ?";
~~~~~~~~


#Marce pas !


Normal !

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

Avatar
ptilou
Bonjour,

Paul Gaborit wrote:
À (at) 27 Jun 2005 00:44:05 -0700,
écrivait (wrote):
[...]
Suis je obligé de passer par un opendir ? (Et abandonner mon script
~~~~~~~




Je comprend pas !

[...]
open dir (DIR, $_ )|| die "le path ?";
~~~~~~~~


#Marce pas !


Normal !

oui, mais pourquoi ? (Je voudrais comprendre pourquoi une commande

Unix marche avec le bash et pas un script shell ?)
PERL = Torture des neuronnes !

J'ai ça comme erreur:
Unquoted string "cutcoul" may clash with future reserved word at
./v4cut-1.pl line 3.
Operator or semicolon missing before &cutcoul at ./v4cut-1.pl line 3.
Ambiguous use of & resolved as operator & at ./v4cut-1.pl line 3.
syntax error at ./v4cut-1.pl line 3, near ") &"
Illegal declaration of subroutine main::cut at ./v4cut-1.pl line 5.
Unquoted string "cutcoul" may clash with future reserved word at
./v4cut-1.pl line 3.
( Il faut enregistre dans un autre fichier la partie sub cutcoul ou la
déplacer parceque ce n'est pas le bon path ?

J'ai réessayé ça :

$arg = shift @ARGV|| die " argument non valide $!";
foreach (@ARGV) &cutcoul;
$a = %ARGV
sub cut-coul {
open (IN, "< $a" )|| die "(pas bien $!)";
open (OUT, ">out.tmp" ) || die "pas ouvert $! ";
$cpt=1;
while ($line = <IN> ) {
if ($line =~ /8001/o)
{
$cpt++;
print OUT $line;
close OUT;
open (OUT, ">out.tmp");
}
else
{
$b = "$cpt$a";
print OUT $line;
rename "out.tmp", $b;
}
}
close OUT;
};

Merçi

Ptilou


Avatar
Jacques Caron
Salut,

On 27 Jun 2005 05:04:04 -0700, wrote:

oui, mais pourquoi ?


opendir != open dir

PERL = Torture des neuronnes !


Des fois oui, mais là faudrait quand même essayer de comprendre ce que tu
fais et pas taper pratiquement n'importe quoi au hasard jusqu'à ce que ça
marche parce que quelqu'un ici aura corrigé les fautes au fur et à
mesure...

$arg = shift @ARGV|| die " argument non valide $!";


Ca ça veut dire que tu vires le premier argument, qui ne sera donc pas un
nom de fichier, je suppsoe?

foreach (@ARGV) &cutcoul;


Tu appelles une fonction qui n'a pas ce nom là (cutcoul != cut-cool). Et
puis c'est pas super utile dans ce contexte, on a vraiment l'impression
que tu essaies n'importe quoi au hasard.

$a = %ARGV


Ca c'est pas possible...

Et si tu essayais tout bêtement ce qu'on t'a déjà proposé?

#!/usr/bin/perl -w

use strict;

for my $a (@ARGV)
{
# faire ce que tu veux avec le fichier dont le nom est dans $a
}

Comme ça tu peux appeler ton script depuis un shell: mon_script *.whatever

Jacques.

Avatar
Stephane Zuckerman
Paul Gaborit wrote:
À (at) 27 Jun 2005 00:44:05 -0700,
écrivait (wrote):
[...]
Suis je obligé de passer par un opendir ? (Et abandonner mon script
~~~~~~~




Je comprend pas !

[...]
open dir (DIR, $_ )|| die "le path ?";
~~~~~~~~


#Marce pas !


Normal !

oui, mais pourquoi ? (Je voudrais comprendre pourquoi une commande



parce que opendir != open dir.

PERL = Torture des neuronnes !


Perl (et non pas PERL) = langage de programmation. Comme tout langage
(même bash), il faut lire la doc. Bash te semble plus simple uniquement
parce qu'implicitement il te permet d'utiliser les commandes classiques.

Utilise des trucs du genre
my $a = `ma commande qui tue`;
et tu auras le même comportement qu'en bash ou presque (je ne vois pas
trop l'intérêt, mais bon).

J'ai ça comme erreur:
Dis, tu voudrais pas lire la doc de Perl (elle est traduite en Français,

à ce que j'ai cru comprendre).

Unquoted string "cutcoul" may clash with future reserved word at
./v4cut-1.pl line 3.
Operator or semicolon missing before &cutcoul at ./v4cut-1.pl line 3.
Ben voilà, il t'explique gentiment ce qui le gêne : il manque un opérateur

ou un ';' (semicolon) avant ton appel à cutcoul().
Ambiguous use of & resolved as operator & at ./v4cut-1.pl line 3.
syntax error at ./v4cut-1.pl line 3, near ") &"
Illegal declaration of subroutine main::cut at ./v4cut-1.pl line 5.
Unquoted string "cutcoul" may clash with future reserved word at
./v4cut-1.pl line 3.

( Il faut enregistre dans un autre fichier la partie sub cutcoul ou la
déplacer parceque ce n'est pas le bon path ?


Il faudrait surtout que tu déclares correctement tes fonctions, en faisant
gaffe à ce que tu aies mis tes ';' en fin d'instruction ; tu verras, ça
ira tout de suite mieux.

$arg = shift @ARGV|| die " argument non valide $!";
foreach (@ARGV) &cutcoul;
$a = %ARGV
?? Pourquoi faire ? Il te manque un ';' au fait


sub cut-coul {
open (IN, "< $a" )|| die "(pas bien $!)";
open (OUT, ">out.tmp" ) || die "pas ouvert $! ";
$cpt=1;
while ($line = <IN> ) {
if ($line =~ /8001/o)
{
$cpt++;
print OUT $line;
close OUT;
open (OUT, ">out.tmp");
}
else
{
$b = "$cpt$a";
print OUT $line;
rename "out.tmp", $b;
}
}
close OUT;
};

Merçi

Ptilou




--
"Je deteste les ordinateurs : ils font toujours ce que je dis, jamais ce
que je veux !"
"The obvious mathematical breakthrough would be development of an easy
way to factor large prime numbers." (Bill Gates, The Road Ahead)



1 2