Vous devriez toujours inclure tout le code pertinent lorsque vous posez une question. Dans ce cas, l'instruction d'impression qui est le centre de votre question. La déclaration d'impression est probablement l'élément d'information le plus crucial. Le deuxième élément d'information le plus important est l'erreur, que vous n'avez pas incluse. La prochaine fois, incluez les deux.
print $ids
devrait être une déclaration assez difficile à gâcher, mais c'est possible. Raisons possibles:
$ids
est indéfini. Donne l'avertissement undefined value in print
$ids
est hors de la portée. Avec use strict
, donne un avertissement fatal Global variable $ids needs explicit package name
, et sinon l'avertissement non défini ci-dessus. Vous avez oublié un point-virgule à la fin de la ligne .
- Vous avez essayé de le faire
print $ids $nIds
, auquel cas perl pense que $ids
est censé être un descripteur de fichier, et vous obtenez une erreur comme print to unopened filehandle
.
Explications
1: ne devrait pas arriver. Il peut se produire si vous faites quelque chose comme ceci (en supposant que vous n'utilisez pas strict
):
my $var;
while (<>) {
$Var .= $_;
}
print $var;
Donne l'avertissement pour la valeur non définie, car $Var
et $var
sont deux variables différentes.
2: ce qui pourrait arriver, si vous faites quelque chose comme ceci:
if ($something) {
my $var = "something happened!";
}
print $var;
my
déclare la variable à l'intérieur du bloc en cours. En dehors du bloc, il est hors de portée.
3: Assez simple, erreur commune, facilement réparable. Plus facile à repérer avec use warnings
.
4: Aussi une erreur commune. Il y a plusieurs façons d'imprimer correctement deux variables dans la même déclaration print
:
print "$var1 $var2"; # concatenation inside a double quoted string
print $var1 . $var2; # concatenation
print $var1, $var2; # supplying print with a list of args
Enfin, quelques perl conseils magiques pour vous:
use strict;
use warnings;
# open with explicit direction '<', check the return value
# to make sure open succeeded. Using a lexical filehandle.
open my $fh, '<', 'file.txt' or die $!;
# read the whole file into an array and
# chomp all the lines at once
chomp(my @file = <$fh>);
close $fh;
my $ids = join(' ', @file);
my $nIds = scalar @file;
print "Number of lines: $nIds\n";
print "Text:\n$ids\n";
La lecture du fichier entier dans un tableau est adapté aux petits fichiers uniquement, sinon il utilise beaucoup de mémoire. Habituellement, ligne par ligne est préférée.
Variations:
print "@file"
équivaut à $ids = join(' ',@file); print $ids;
$#file
renverront le dernier indice dans @file
. Puisque les tableaux commencent généralement à 0, $#file + 1
est équivalent à scalar @file
.
Vous pouvez également faire:
my $ids;
do {
local $/;
$ids = <$fh>;
}
Par temporairement « éteindre » $/
, le séparateur d'enregistrement d'entrée, à savoir retour à la ligne, vous ferez <$fh>
retour le fichier entier. Ce que fait vraiment <$fh>
est lu jusqu'à ce qu'il trouve $/
, puis retourne cette chaîne. Notez que cela préservera les nouvelles lignes dans $ids
.
solution ligne par ligne:
open my $fh, '<', 'file.txt' or die $!; # btw, $! contains the most recent error
my $ids;
while (<$fh>) {
chomp;
$ids .= "$_ "; # concatenate with string
}
my $nIds = $.; # $. is Current line number for the last filehandle accessed.
-1 pour "Perl se plaint" plutôt que de partager le texte du message réel. – tadmc