J'utilise Perl sous Windows (Perl actif). J'ai un programme Perl pour Glob the Files dans le dossier actuel et les concaténez tous à l'aide de la commande DOS Copy appelée à partir de l'intérieur à l'aide du système () ...
Lorsque j'exécute, cela donne une erreur DOS disant "Le système ne peut pas trouver le fichier spécifié. " Il est lié aux espaces dans les noms de fichiers que j'ai. P>
Ceci est le code Perl: - p>
@files = glob "*.mp3"; $outfile = 'final.mp3'; $firsttime = 1; foreach (@files) { if($firsttime == 1) { @args = ('copy' ,"/b ","$_","+","$outfile", "$outfile"); system (@args); #system("copy /b '$_'+$outfile $outfile"); $firsttime = 0; } else { @args = ('copy' ,"/b ","$outfile","+","$_", "$outfile"); system (@args); #system("copy /b $outfile+'$_' $outfile"); } }
7 Réponses :
Votre code n'ajoute aucune citation autour des noms de fichiers.
Essayez p>
"\"$outfile\""
sous Windows Vous pouvez normalement mettre des citations doubles autour des noms de fichiers (et / ou des chemins) permettant aux caractères spéciaux, c'est-à-dire des caractères spéciaux, c'est-à-dire des «noms de fichiers longs».
c: \ "mon chemin long \ Ceci est un fichier.mp3" p>
EDIT: P>
Est-ce que cela ne fonctionne pas? P>
system("copy /b \"$_\"+$outfile $outfile");
@Viper_sb: Je sais, mais comment atteindre cet effet dans le script Perl est la question.
Ne va-t-il pas maintenant casser pour un fichier "nom" .mp3 code>? essayez
\ "\ q $ _ \ e \" code>
Les problèmes peuvent survenir lorsque vous essayez d'accéder à la variable à: p> puis effectuez les modifications nécessaires sur $ _ code> à l'intérieur d'un bloc intérieur. La manière la plus sûre, changement:
@args code>, et échappez aux doublesquotes pour les inclure dans la chaîne .. p>
Arrêtez d'utiliser System () Code> pour faire un appel pouvant être effectué avec une bibliothèque portable. Perl a un Fichier :: Copier module, utilisez-le à la place et vous n'avez pas à vous soucier des choses comme Cela plus vous obtenez beaucoup mieux portabilité du système d'exploitation. P>
Merci pour cette approche différente en utilisant le fichier :: copie.
pour concaténer tous les fichiers: p> système code> est rarement la bonne réponse,
Utilisez Fichier :: Copie < / a>; code>
@ Gravity: Merci pour l'extrait de code montrant l'utilisation de fichier :: copie.
$ FileName = ~ s / \ / \ /; p>
Quel que soit le nom de fichier, utilisez simplement SLASH pour les espaces de référence p>
La commande "RENAME" intégrée Déplace également les fichiers:
rename $source, $destination; # ...and move
Pourquoi ne pas lire les fichiers et les imprimer tous dans un fichier de sortie?
@ROBERT: signification ouverte (), lire () et écrire () l'un après l'autre ..
Aucune idée pourquoi cette question n'a jamais reçu de uppote. +1 de moi. Courut dans le même problème (encore) ...: - / ... juste maintenant.