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
}
Des fois oui, mais là faudrait quand même essayer de comprendre ce qu e 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 *.whate ver
Mais, je préfaire l'appeler via mon bash script pour pouvour faire du récursif ? Comment dois je faire ? J'utilise ça en bash :
#!/bin/bash function f_pdf2text { ./v4cut-1.pl "$1" } { find . -type f -name "*.hex" -maxdepth 1 echo "EOF" } | { while true; do read -r i test "$i" = "EOF" && break f_pdf2text "$i" done }
Ptilou
Bonjour, Merci, merci :)
Jacques Caron wrote:
Salut,
On 27 Jun 2005 05:04:04 -0700, <ptilou@gmail.com> wrote:
oui, mais pourquoi ?
opendir != open dir
PERL = Torture des neuronnes !
Des fois oui, mais là faudrait quand même essayer de comprendre ce qu e 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 *.whate ver
Mais, je préfaire l'appeler via mon bash script
pour pouvour faire du récursif ?
Comment dois je faire ?
J'utilise ça en bash :
#!/bin/bash
function f_pdf2text {
./v4cut-1.pl "$1"
}
{
find . -type f -name "*.hex" -maxdepth 1
echo "EOF"
} | {
while true; do
read -r i
test "$i" = "EOF" && break
f_pdf2text "$i"
done
}
Des fois oui, mais là faudrait quand même essayer de comprendre ce qu e 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 *.whate ver
Mais, je préfaire l'appeler via mon bash script pour pouvour faire du récursif ? Comment dois je faire ? J'utilise ça en bash :
#!/bin/bash function f_pdf2text { ./v4cut-1.pl "$1" } { find . -type f -name "*.hex" -maxdepth 1 echo "EOF" } | { while true; do read -r i test "$i" = "EOF" && break f_pdf2text "$i" done }
Ptilou
Benoit Izac
Bonjour,
le 27/06/2005 à 14:04, a écrit dans le message :
PERL = Torture des neuronnes !
C'est toi qui t'embrouille depuis le début.
Je te propose de partir sur de bonnes bases ; 2 solutions : 1) tu passes les noms des fichiers à ton script via le shell % ./mon_script.pl *what* ou % find /where -name '*what*' -print0 | xargs -0 ./mon_script.pl
et dans mon_script.pl : if (@ARGV) { foreach my $file (@ARGV) { # fait ce que tu veux avec $file } } else { print STDERR "usage: $0 file ...n"; }
2) tu passes en argument à ton script directement le nom du ou des repertoires que tu veux traiter % ./mon_script.pl /home/ptilou /usr /tmp
et dans mon_script.pl : #!/usr/bin/perl
use warnings; use strict; use File::Find;
sub cutcoul { if (/.pdf$/) { # correspond à *.pdf dans le shell open my $in, "<", "$File::Find::name" or die "can't open $File::Find::name: $!"; open my $out, ">", "out.tmp" or die "can't open out.tmp: $!"; my $cpt = 1; while (<$in>) { if (/8001/) { $cpt++; print $out $_; # faire ce que tu veux que je ne comprends pas. } else { # encore des trucs incompréhensibles pour moi. } } close $out; close $in; } }
if (@ARGV) { find(&cutcoul, @ARGV); } else { print STDERR "usage: $0 dir ...n" } __END__
Ensuite, je pense qu'il y a un gros soucis dans ton script : | open (OUT, ">out.tmp" ) || die "pas ouvert $! "; | [...] | print OUT $line; | close OUT; | open (OUT, ">out.tmp"); ceci n'a aucun sens, tu écris dans un fichier et tu supprimes tout ce que tu viens d'écrire 2 lignes plus loin.
Tu devrais commencer par lire un bon livre (Introduction à Perl par exemple) sinon il est certain que tes neurones ne vont pas tenir.
-- Benoit Izac
Bonjour,
le 27/06/2005 à 14:04, ptilou@gmail.com a écrit
dans le message <1119873844.109727.180730@g14g2000cwa.googlegroups.com> :
PERL = Torture des neuronnes !
C'est toi qui t'embrouille depuis le début.
Je te propose de partir sur de bonnes bases ; 2 solutions :
1) tu passes les noms des fichiers à ton script via le shell
% ./mon_script.pl *what*
ou
% find /where -name '*what*' -print0 | xargs -0 ./mon_script.pl
et dans mon_script.pl :
if (@ARGV) {
foreach my $file (@ARGV) {
# fait ce que tu veux avec $file
}
} else {
print STDERR "usage: $0 file ...n";
}
2) tu passes en argument à ton script directement le nom du ou des
repertoires que tu veux traiter
% ./mon_script.pl /home/ptilou /usr /tmp
et dans mon_script.pl :
#!/usr/bin/perl
use warnings;
use strict;
use File::Find;
sub cutcoul {
if (/.pdf$/) { # correspond à *.pdf dans le shell
open my $in, "<", "$File::Find::name"
or die "can't open $File::Find::name: $!";
open my $out, ">", "out.tmp"
or die "can't open out.tmp: $!";
my $cpt = 1;
while (<$in>) {
if (/8001/) {
$cpt++;
print $out $_;
# faire ce que tu veux que je ne comprends pas.
} else {
# encore des trucs incompréhensibles pour moi.
}
}
close $out;
close $in;
}
}
if (@ARGV) {
find(&cutcoul, @ARGV);
} else {
print STDERR "usage: $0 dir ...n"
}
__END__
Ensuite, je pense qu'il y a un gros soucis dans ton script :
| open (OUT, ">out.tmp" ) || die "pas ouvert $! ";
| [...]
| print OUT $line;
| close OUT;
| open (OUT, ">out.tmp");
ceci n'a aucun sens, tu écris dans un fichier et tu supprimes tout ce
que tu viens d'écrire 2 lignes plus loin.
Tu devrais commencer par lire un bon livre (Introduction à Perl par
exemple) sinon il est certain que tes neurones ne vont pas tenir.
Je te propose de partir sur de bonnes bases ; 2 solutions : 1) tu passes les noms des fichiers à ton script via le shell % ./mon_script.pl *what* ou % find /where -name '*what*' -print0 | xargs -0 ./mon_script.pl
et dans mon_script.pl : if (@ARGV) { foreach my $file (@ARGV) { # fait ce que tu veux avec $file } } else { print STDERR "usage: $0 file ...n"; }
2) tu passes en argument à ton script directement le nom du ou des repertoires que tu veux traiter % ./mon_script.pl /home/ptilou /usr /tmp
et dans mon_script.pl : #!/usr/bin/perl
use warnings; use strict; use File::Find;
sub cutcoul { if (/.pdf$/) { # correspond à *.pdf dans le shell open my $in, "<", "$File::Find::name" or die "can't open $File::Find::name: $!"; open my $out, ">", "out.tmp" or die "can't open out.tmp: $!"; my $cpt = 1; while (<$in>) { if (/8001/) { $cpt++; print $out $_; # faire ce que tu veux que je ne comprends pas. } else { # encore des trucs incompréhensibles pour moi. } } close $out; close $in; } }
if (@ARGV) { find(&cutcoul, @ARGV); } else { print STDERR "usage: $0 dir ...n" } __END__
Ensuite, je pense qu'il y a un gros soucis dans ton script : | open (OUT, ">out.tmp" ) || die "pas ouvert $! "; | [...] | print OUT $line; | close OUT; | open (OUT, ">out.tmp"); ceci n'a aucun sens, tu écris dans un fichier et tu supprimes tout ce que tu viens d'écrire 2 lignes plus loin.
Tu devrais commencer par lire un bon livre (Introduction à Perl par exemple) sinon il est certain que tes neurones ne vont pas tenir.
-- Benoit Izac
ptilou
Bonjour,
Bonjour,
le 27/06/2005 à 14:04, a écrit dans le message :
PERL = Torture des neuronnes !
C'est toi qui t'embrouille depuis le début.
Je te propose de partir sur de bonnes bases ; 2 solutions : 1) tu passes les noms des fichiers à ton script via le shell % ./mon_script.pl *what* ou % find /where -name '*what*' -print0 | xargs -0 ./mon_script.pl
Cette solution ne marche pas, ma question c'est pourquoi ?
[...]
Ensuite, je pense qu'il y a un gros soucis dans ton script : | open (OUT, ">out.tmp" ) || die "pas ouvert $! "; | [...] | print OUT $line; | close OUT; | open (OUT, ">out.tmp"); ceci n'a aucun sens, tu écris dans un fichier et tu supprimes tout ce que tu viens d'écrire 2 lignes plus loin.
Non, et j'ai essayé de supprimé des lignes (celles que tu cite ci-dessus), dans se cas il perd la première partie du fichier ...
Ptilou
Bonjour,
Bonjour,
le 27/06/2005 à 14:04, ptilou@gmail.com a écrit
dans le message <1119873844.109727.180730@g14g2000cwa.googlegroups.com> :
PERL = Torture des neuronnes !
C'est toi qui t'embrouille depuis le début.
Je te propose de partir sur de bonnes bases ; 2 solutions :
1) tu passes les noms des fichiers à ton script via le shell
% ./mon_script.pl *what*
ou
% find /where -name '*what*' -print0 | xargs -0 ./mon_script.pl
Cette solution ne marche pas, ma question c'est pourquoi ?
[...]
Ensuite, je pense qu'il y a un gros soucis dans ton script :
| open (OUT, ">out.tmp" ) || die "pas ouvert $! ";
| [...]
| print OUT $line;
| close OUT;
| open (OUT, ">out.tmp");
ceci n'a aucun sens, tu écris dans un fichier et tu supprimes tout ce
que tu viens d'écrire 2 lignes plus loin.
Non, et j'ai essayé de supprimé des lignes (celles que tu cite
ci-dessus), dans se cas il perd la première partie du fichier ...
Je te propose de partir sur de bonnes bases ; 2 solutions : 1) tu passes les noms des fichiers à ton script via le shell % ./mon_script.pl *what* ou % find /where -name '*what*' -print0 | xargs -0 ./mon_script.pl
Cette solution ne marche pas, ma question c'est pourquoi ?
[...]
Ensuite, je pense qu'il y a un gros soucis dans ton script : | open (OUT, ">out.tmp" ) || die "pas ouvert $! "; | [...] | print OUT $line; | close OUT; | open (OUT, ">out.tmp"); ceci n'a aucun sens, tu écris dans un fichier et tu supprimes tout ce que tu viens d'écrire 2 lignes plus loin.
Non, et j'ai essayé de supprimé des lignes (celles que tu cite ci-dessus), dans se cas il perd la première partie du fichier ...
Ptilou
Jacques Caron
Salut,
On 27 Jun 2005 05:37:40 -0700, wrote:
Mais, je préfaire l'appeler via mon bash script pour pouvour faire du récursif ? Comment dois je faire ? J'utilise ça en bash :
#!/bin/bash function f_pdf2text { ./v4cut-1.pl "$1" } { find . -type f -name "*.hex" -maxdepth 1 echo "EOF" } | { while true; do read -r i test "$i" = "EOF" && break f_pdf2text "$i" done }
Comme déjà dit précédemment, c'est horriblement compliqué pour ce que tu veux faire, et un bête:
devrait suffire. Evidemment, ton script perl ne doit plus gérer qu'un s eul fichier, dont le nom est dans $ARGV[0], et rien d'autre.
Biensurs ( Pourquoi pas $_ ?) ! Mais ça marche pas !
Du coup j'ai une autre question, que tu as du ( et tu n'es pas le seul ) subodorer: Comment faire pour qu'un ls -R, me donne sur la sortie /le_folder/le_fichier et non ./le_folder fichier_1 fichier_2 etc ...
Ptilou
Bonsoir,
Salut,
On 27 Jun 2005 05:37:40 -0700, <ptilou@gmail.com> wrote:
Mais, je préfaire l'appeler via mon bash script
pour pouvour faire du récursif ?
Comment dois je faire ?
J'utilise ça en bash :
#!/bin/bash
function f_pdf2text {
./v4cut-1.pl "$1"
}
{
find . -type f -name "*.hex" -maxdepth 1
echo "EOF"
} | {
while true; do
read -r i
test "$i" = "EOF" && break
f_pdf2text "$i"
done
}
Comme déjà dit précédemment, c'est horriblement compliqué pour ce que tu
veux faire, et un bête:
devrait suffire. Evidemment, ton script perl ne doit plus gérer qu'un s eul
fichier, dont le nom est dans $ARGV[0], et rien d'autre.
Biensurs ( Pourquoi pas $_ ?) ! Mais ça marche pas !
Du coup j'ai une autre question, que tu as du ( et tu n'es pas le seul
) subodorer:
Comment faire pour qu'un ls -R,
me donne sur la sortie /le_folder/le_fichier
et non
./le_folder
fichier_1
fichier_2
etc ...
devrait suffire. Evidemment, ton script perl ne doit plus gérer qu'un s eul fichier, dont le nom est dans $ARGV[0], et rien d'autre.
Biensurs ( Pourquoi pas $_ ?) ! Mais ça marche pas !
Du coup j'ai une autre question, que tu as du ( et tu n'es pas le seul ) subodorer: Comment faire pour qu'un ls -R, me donne sur la sortie /le_folder/le_fichier et non ./le_folder fichier_1 fichier_2 etc ...
Ptilou
Jacques Caron
Re,
On 27 Jun 2005 09:25:27 -0700, wrote:
Comme déjà dit précédemment, c'est horriblement compliqué pour ce que tu veux faire, et un bête:
devrait suffire. Evidemment, ton script perl ne doit plus gérer qu'un seul fichier, dont le nom est dans $ARGV[0], et rien d'autre.
Biensurs ( Pourquoi pas $_ ?)
Parce que $_ ne contient pas le nom du fichier passé en argument, par défaut.
Mais ça marche pas !
Si si, ça marche très bien si tu fais pas n'importe quoi au hasard. T'as qu'à essayer en remplaçant "./v4cut-1.pl" par "echo" dans le find donné plus haut, tu verras, ça marche très bien, il faut juste avoir un script qui fait ce qu'il faut, ce qui semble être le plus difficile à faire en tapant des trucs au hasard.
Du coup j'ai une autre question, que tu as du ( et tu n'es pas le seul ) subodorer: Comment faire pour qu'un ls -R, me donne sur la sortie /le_folder/le_fichier et non ./le_folder fichier_1 fichier_2 etc ...
Ben on n'utilise pas ls -R pour ça mais find sans le -maxdepth et hop...
Jacques.
Re,
On 27 Jun 2005 09:25:27 -0700, <ptilou@gmail.com> wrote:
Comme déjà dit précédemment, c'est horriblement compliqué pour ce que tu
veux faire, et un bête:
devrait suffire. Evidemment, ton script perl ne doit plus gérer qu'un
seul
fichier, dont le nom est dans $ARGV[0], et rien d'autre.
Biensurs ( Pourquoi pas $_ ?)
Parce que $_ ne contient pas le nom du fichier passé en argument, par
défaut.
Mais ça marche pas !
Si si, ça marche très bien si tu fais pas n'importe quoi au hasard. T'as
qu'à essayer en remplaçant "./v4cut-1.pl" par "echo" dans le find donné
plus haut, tu verras, ça marche très bien, il faut juste avoir un script
qui fait ce qu'il faut, ce qui semble être le plus difficile à faire en
tapant des trucs au hasard.
Du coup j'ai une autre question, que tu as du ( et tu n'es pas le seul
) subodorer:
Comment faire pour qu'un ls -R,
me donne sur la sortie /le_folder/le_fichier
et non
./le_folder
fichier_1
fichier_2
etc ...
Ben on n'utilise pas ls -R pour ça mais find sans le -maxdepth et hop...
devrait suffire. Evidemment, ton script perl ne doit plus gérer qu'un seul fichier, dont le nom est dans $ARGV[0], et rien d'autre.
Biensurs ( Pourquoi pas $_ ?)
Parce que $_ ne contient pas le nom du fichier passé en argument, par défaut.
Mais ça marche pas !
Si si, ça marche très bien si tu fais pas n'importe quoi au hasard. T'as qu'à essayer en remplaçant "./v4cut-1.pl" par "echo" dans le find donné plus haut, tu verras, ça marche très bien, il faut juste avoir un script qui fait ce qu'il faut, ce qui semble être le plus difficile à faire en tapant des trucs au hasard.
Du coup j'ai une autre question, que tu as du ( et tu n'es pas le seul ) subodorer: Comment faire pour qu'un ls -R, me donne sur la sortie /le_folder/le_fichier et non ./le_folder fichier_1 fichier_2 etc ...
Ben on n'utilise pas ls -R pour ça mais find sans le -maxdepth et hop...