2015-10-30 1 views
3

je le code suivant dans un script cgi qui regroupe seulement les fichiers xml dans un zip pour le téléchargement:fichiers correspondant à Perl glob sur windows vs linux

my $obj = Archive::Zip->new(); 
foreach my $xml_file (glob(File::Spec->catfile($in_path,"*.xml"))) 
{ 
    $obj->addFile($xml_file); 
} 
$obj->writeToFileNamed($zipfile_name); 

Cela fonctionne très bien sur les tests unitaires et quand je le lance sous Linux, mais lorsqu'il est installé sur windows, je reçois:

Can't call method "desiredCompressionLevel" on an undefined value at /usr/share/perl5/Archive/Zip/Archive.pm line 249. 

dans les deux cas, il fonctionne bien sur Linux et sous test unitaire, mais échoue lorsqu'il est installé sur windows (il y a des fichiers XML dans le répertoire qui devrait être ramassé...).

+1

Y a-t-il un espace dans le chemin Windows? – choroba

+1

@ikegami, vous avez raison. J'ai changé deux choses à la fois quand j'ai fait ce test. Le si défini ne fait pas de différence –

Répondre

7

Je pense que le commentaire de choroba est correct. Puisque cela n'arrive que lorsque vous installez sur Windows plutôt que lorsque vous testez sur Windows, je parie que c'est un problème d'espace "C: \ Program Files". Il est répertorié dans la documentation pour le fichier de Perl :: Glob:

Pour des raisons historiques, CORE :: glob() va également diviser son argument sur les espaces, le traitant comme de multiples motifs, alors que bsd_glob() les considère comme un modèle.

Cela pourrait facilement casser des choses. Les docs recommandent d'utiliser bsd_glob() au lieu de glob dans ce cas.

Je peux couper et coller votre code et l'exécuter sur Windows avec $ in_path == ".", Mais il casse quand j'utilise $ in_path = "C: \ Path With Spaces". En outre, avec des espaces, je suis sûr qu'il échouera aussi sur Linux.