OVH Cloud OVH Cloud

BUG ?

2 réponses
Avatar
googlrgroups.3.fredo
Bonjour,

je n'arrive pas à trouver dans le "changes log" si c'est normal ou si
c'est un bug.
Voilà la fonction qui tue :

$rep = "C:\\";
foreach $fic (<$rep*.*>){
print "$fic\n";
}

Avec Perl 5.0.0.5 ça renvoie tous les fichiers et répertoires, mais
avec la 5.6.1 build 631 ça ne retourne que les fichiers (ou
répertoires) qui ont une extension !
La solution avec le moins de modif est de faire "foreach $fic
(<$rep*>){".

Mon problème est que dans mon entreprises j'ai plus de 100 serveurs
avec ce script donc on ne va pas modifier tous les scripts
potentiellement affectés, mais j'aimerais pouvoir faire la mise à jour
de perl vers la 5.6.1 (celle que l'on déploie actuellement - il est
trop dangereux pour la production d'essayer la 5.8 car trop de tests à
faire qui prendraient des mois).

Est-ce un problème connu ? Est-ce que la release 632 ou supérieure
corrige ce problème ?

Merci d'avance.

2 réponses

Avatar
Paul Gaborit
À (at) 21 Jun 2005 05:18:03 -0700,
(Fredo) écrivait (wrote):
je n'arrive pas à trouver dans le "changes log" si c'est normal ou si
c'est un bug.
Voilà la fonction qui tue :

$rep = "C:";
foreach $fic (<$rep*.*>){
print "$ficn";
}

Avec Perl 5.0.0.5 ça renvoie tous les fichiers et répertoires, mais
avec la 5.6.1 build 631 ça ne retourne que les fichiers (ou
répertoires) qui ont une extension !


Une petite remarque préalable : Windows (ou plutôt la libc de Windows)
comprend très bien les chemins dont les séparateurs sont des / à la place du
. C'est vrai dans tous les langages. Donc profitez-en pour ne pas utiliser
qui pose bcp de problèmes.

Sinon, dans la doc de la fonction glob() de la version 5.6, on trouve :

glob EXPR
glob Returns the value of EXPR with filename expansions
such as the standard Unix shell /bin/csh would do.
This is the internal function implementing the
"<*.c>" operator, but you can use it directly. If
EXPR is omitted, $_ is used. The "<*.c>" operator
is discussed in more detail in "I/O Operators" in
perlop.

Beginning with v5.6.0, this operator is implemented
using the standard "File::Glob" extension. See
File::Glob for details.

ou (en français pour la version 5.8.5) :

glob EXPR
glob

Dans un contexte de liste, retourne la liste (éventuellement
vide) des fichiers correspondants à l'expansion de la valeur de
EXPR telle que le shell standard Unix /bin/csh la ferait. Dans un
contexte scalaire, glob produit les éléments de cette liste un
par un jusqu'à l'épuiser puis il retourne undef. C'est la
fonction interne qui implémente l'opérateur <*.c> mais vous
pouvez l'utiliser directement. Si EXPR est omis, $_ est utilisé à
la place. L'opérateur <*.c> est présenté plus en détail dans Les
opérateurs d'E/S dans la page de manuel perlop.

Depuis la version v5.6.0, cet opérateur est implémenté via
l'extension standard File::Glob. Voir la page de manuel
File::Glob pour plus de détails.

Il y a donc bien eu modification du comportement entre votre ancienne version
et la version 5.6.x et suivantes.

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

Avatar
Emmanuel Florac
Le Tue, 21 Jun 2005 05:18:03 -0700, Fredo a écrit :


Avec Perl 5.0.0.5 ça renvoie tous les fichiers et répertoires, mais avec
la 5.6.1 build 631 ça ne retourne que les fichiers (ou répertoires) qui
ont une extension ! La solution avec le moins de modif est de faire
"foreach $fic (<$rep*>){".


C'est rigoureusement normal si j'en crois la doc:

* glob EXPR
* glob

In list context, returns a (possibly empty) list of filename
expansions on the value of EXPR such as the standard Unix shell
/bin/csh would do. [...]

Beginning with v5.6.0, this operator is implemented using the
standard File::Glob extension. See File::Glob for details.

Voyons File ::Glob:

File::Glob::bsd_glob() implements the FreeBSD glob(3) routine, which is
a superset of the POSIX glob() (described in IEEE Std 1003.2 "POSIX.2").


Donc le comportement normal des fileglobs est celui connu sous BSD et
Unix, pas le comportement "MS-DOS", à partir de perl 5.6.0.

De plus, il est recommandé sous win32/perl d'utiliser "/" comme
séparateur de dossier, et non "". Voir, là encore, la documentation de
File::Glob.

--
Si ça a l'air facile, c'est difficile. Si ça a l'air difficile, c'est
carrément impossible. Si ça a l'air impossible, c'est un compilateur
Ada.
Théorème de Stockmayer.