Siempre debe incluir todo el código relevante al hacer una pregunta. En este caso, la declaración de impresión que es el centro de su pregunta. La declaración impresa es probablemente la información más crucial. La segunda información más importante es el error, que tampoco incluyó. La próxima vez, incluye ambos.
print $ids
debe ser una declaración bastante difícil de desastre, pero es posible. Posibles razones:
$ids
no está definido. Da el aviso undefined value in print
$ids
está fuera de alcance. Con use strict
, da advertencia fatal Global variable $ids needs explicit package name
, y de lo contrario la advertencia indefinida desde arriba.
- Olvidó un punto y coma al final de la línea.
- que intentaste hacer
print $ids $nIds
, en cuyo caso el Perl piensa que $ids
se supone que es un gestor de archivo, y se obtiene un error como print to unopened filehandle
.
Explicaciones
1: no pasaran. Se podría pasar si haces algo como esto (suponiendo que no está utilizando strict
):
my $var;
while (<>) {
$Var .= $_;
}
print $var;
emite el aviso de valor indefinido, porque $Var
y $var
son dos variables diferentes.
2: Puede ocurrir, si haces algo como esto:
if ($something) {
my $var = "something happened!";
}
print $var;
my
declara la variable dentro del bloque actual. Fuera del bloque, está fuera del alcance.
3: Bastante simple, error común, puede arreglar fácilmente. Más fácil de detectar con use warnings
.
4: También un error común. Hay un número de maneras de imprimir correctamente dos variables en la misma print
declaración:
print "$var1 $var2"; # concatenation inside a double quoted string
print $var1 . $var2; # concatenation
print $var1, $var2; # supplying print with a list of args
Por último, algunos consejos mágicos Perl para usted:
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";
leer todo el archivo en una matriz es adecuado solo para archivos pequeños, de lo contrario, usa mucha memoria. Por lo general, se prefiere línea por línea.
Variaciones:
print "@file"
es equivalente a $ids = join(' ',@file); print $ids;
$#file
devolverán el último índice en @file
. Como las matrices generalmente comienzan en 0, $#file + 1
es equivalente a scalar @file
.
También puede hacer:
my $ids;
do {
local $/;
$ids = <$fh>;
}
Por temporalmente "apagar" $/
, el separador de registro de entrada, es decir, de nueva línea, que hará que el retorno <$fh>
todo el archivo. Lo que <$fh>
realmente hace es leer hasta que encuentre $/
, luego devuelva esa cadena. Tenga en cuenta que esto preservará las nuevas líneas en $ids
.
solución línea por línea:
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 para "Perl se queja" en lugar de compartir el texto del mensaje real. – tadmc