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 ?
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/>
À (at) 21 Jun 2005 05:18:03 -0700,
googlrgroups.3.fredo@spamgourmet.com (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 :
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/>
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/>
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.
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.
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.