Comment puis-je traiter une chaîne multi-ligne une ligne à la fois en perl, avec l'utilisation stricte en place?
J'essaie de trouver le bon PBP approuvé la manière de traiter une chaîne multi-ligne une ligne à la fois. De nombreux programmeurs Perl suggèrent le traitement de la multi-ligne de chaîne comme un descripteur de fichier, qui fonctionne très bien, sauf si vous avez "use strict" dans votre script. Ensuite, vous obtenez un avertissement du compilateur de ne pas être en mesure d'utiliser une chaîne comme un symbole, tandis que le strict refs est en cours d'utilisation.
Voici un simple exemple de problème:
#use strict;
use warnings;
my $return = `dir`;
my $ResultsHandle = "";
my $matchLines = "";
my $resultLine = "";
open $ResultsHandle, '<', $return;
while (defined ($resultLine = <$ResultsHandle>)) {
if ($resultLine =~ m/joe/) {
$matchLines = $matchLines . "\t" . $resultLine;
}
}
close($ResultsHandle);
print "Original string: \n$return\n";
print "Found these matching lines: \n$matchLines\n";
Avis que le "use strict" de la ligne est commentée. Lorsque j'exécute ce script sans l'utilisation stricte, j'obtiens ce que je veux et s'attendre:
Original string:
Volume in drive D has no label.
Volume Serial Number is 50D3-54A6
Directory of D:\Documents and Settings\username\My Documents\Eclipse\myTestProject
09/18/2009 11:38 AM <DIR> .
09/18/2009 11:38 AM <DIR> ..
09/18/2009 11:36 AM 394 .project
09/18/2009 11:37 AM 0 joe.txt
09/18/2009 11:37 AM 0 joey.txt
09/18/2009 11:38 AM 0 kurt.txt
09/18/2009 11:43 AM 497 main.pl
09/18/2009 11:38 AM 0 shane.txt
6 File(s) 891 bytes
2 Dir(s) 6,656,188,416 bytes free
Found these matching lines:
09/18/2009 11:37 AM 0 joe.txt
09/18/2009 11:37 AM 0 joey.txt
Voici le problème, cependant. Quand j'ai dé-commenter le "use strict" de la ligne, j'obtiens le message d'avertissement suivant ou erreur de Perl:
Can't use string ("") as a symbol ref while "strict refs" in use at D:/Documents and Settings/username/My Documents/Eclipse/myTestProject/main.pl line 8.
La ligne 8 est le "open $ResultsHandle, '<', \$retour;" la ligne, par la manière. Donc, depuis Perl Best Practices m'oblige à l'utilisation stricte, comment ne PBP m'attendre à un processus multi-ligne de chaîne une ligne à la fois? Toutes les suggestions de la communauté?
Merci!
Merci, Manni. Le répertoire d'extraction du contenu était juste pour les besoins de la démonstration. Mon programme fait des appels d'un autre programme et le processus de sa production. Et l'ancienne initialisation d'une variable est quelque chose que je dois travailler plus sur. Mais j'ai souvent cut & coller à partir de vieux scripts et c'est ce que je reçois. 🙂 J'essaie de faire mieux, mais.
OriginalL'auteur Kurt W. Leucht | 2009-09-18
Vous devez vous connecter pour publier un commentaire.
Ne pas initialiser
$ResultsHandle
:Si vous laissez
$ResultsHandle
pas défini avant laopen()
, il sera rempli avec une référence à la poignée de fichier. Parce que vous étiez en paramètre une chaîne de caractères,open()
présumé que c'était censé être une référence symbolique à une variable au lieu --- non autorisé en vertu deuse strict
.Montre également que je ne comprends pas "strict". J'ai été juste essayer de s'il vous plaît le compilateur et le Perl Critique module à la fois sans comprendre pleinement tous les messages qu'ils ont tous les deux été génératrice.
Une autre façon de penser:
open()
initialise$ResultsHandle
pour vous, si c'est pas déjà été initialisé.use strict
interdit de choses qui peut être utile parfois, mais le plus souvent causer des ennuis.OriginalL'auteur dave4420
La plus succincte PBP façon est d'utiliser des ouvert comme suit:
Ceci élimine le besoin pour que plus tôt "mon $Resultshandle;" déclaration et évite d'engager que stricte avertissement que vous avez couru dans.
OriginalL'auteur draegtun
Vous pouvez également utiliser une regexp comme un itérateur:
C'est un peu moins compliqué par rapport à l'utilisation d'un descripteur de fichier qui représente une chaîne de caractères.
OriginalL'auteur jrockway
Convertir multi-ligne de chaîne dans une liste de ligne de chaînes avec
split
:OriginalL'auteur mob
Changement
à
OriginalL'auteur moonshadow
Ouvrir un descripteur de fichier à l'aide d'un tuyau de commande "dir".
E. g.
OriginalL'auteur DVK
Meilleur résultat de split peut être fait par:
OriginalL'auteur Znik