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

$^I ne fonctionne qu'avec ?

2 réponses
Avatar
ctobini
Bonjour,

J'aurais un petite question concernant $^I :

J'ai ouvert un filehandle comme ceci :

#/bin/env perl

use strict;

$^I =3D '.bak';

open A, shift;
while(<A>) {
s/ligne/LIGNE/;
print
}
close A;

Ca ne fonctionne pas, de cette mani=E8re il n'y a que while(<>) {...}
qui effectue un changement.

Sauriez-vous comment faire (en particulier s'il y a plusieurs handle
dans un script et qu'on veut appliquer tel changement =E0 tel handle) ?

En vous remerciant,

C=2E Tobini

2 réponses

Avatar
Klaus
On Mar 24, 1:08 pm, "ctobini" wrote:
Bonjour,

J'aurais un petite question concernant $^I :

J'ai ouvert un filehandle comme ceci :

#/bin/env perl

use strict;

$^I = '.bak';

open A, shift;
while(<A>) {
s/ligne/LIGNE/;
print}

close A;

Ca ne fonctionne pas, de cette manière il n'y a que while(<>) {...}
qui effectue un changement.

Sauriez-vous comment faire (en particulier s'il y a plusieurs handle
dans un script et qu'on veut appliquer tel changement à tel handle) ?


Voici un scénario:

On a 4 fichiers à traiter ('a.txt', 'b.txt', 'c.txt', 'd.txt'), mais
on veut appliquer le traitement spécifique (s/ligne/LIGNE/g)
uniquement pour le fichier 'b.txt'.

Voici le programme:
========================= ==========
use strict;
use warnings;

$^I = '.bak';
push @ARGV, 'a.txt', 'b.txt', 'c.txt', 'd.txt';

my @file = @ARGV;
my $lgn = 0;
while (<>) {
$lgn++;
my $fic = $file[-$#ARGV - 2];

my $nbr_rempl = '';
$nbr_rempl = s/ligne/LIGNE/g + 0
if $fic eq 'b.txt'; # <<<<=== voici le if
print '> ', $_;

warn "Fic '$fic', ligne $lgn, nbr rempl = $nbr_rempln";

if (eof) { $lgn = 0; warn "---changement fichiern" }
}
========================= ==========

Avatar
ctobini
Bonjour et merci beaucoup pour la réponse,

Non seulement elle me satisfait mais je vois aussi de la même
manière :

comment visualiser le fichier courant dans une boucle <>
my $fic = $file[-$#ARGV - 2];

comment comptabiliser le nombre de remplacements directement dans un
scalaire :
$nbr_rempl = s/ligne/LIGNE/g + 0

Merci triplement donc :-) et bonne soirée,

C. Tobini