2011-05-30 12 views
15

Tengo algo de código que se parece aCómo imprimir las variables en Perl

my ($ids,$nIds); 
while (<myFile>){ 
    chomp; 
    $ids.= $_ . " "; 
    $nIds++; 
} 

Esto debe concatenar cada línea en mi myFile, y nIds debería ser mi número de líneas. ¿Cómo imprimo mi $ids y $nIds?

me trataron simplemente print $ids, pero se queja de Perl.

my ($ids, $nIds) 

es una lista, ¿no? Con dos elementos?

+8

-1 para "Perl se queja" en lugar de compartir el texto del mensaje real. – tadmc

Respuesta

16
print "Number of lines: $nids\n"; 
print "Content: $ids\n"; 

¿Cómo se quejó Perl? print $ids debería funcionar, aunque es probable que desee una nueva línea al final, ya sea de forma explícita con print que el anterior o implícitamente mediante el uso de say o -l/$\.

Si desea interpolar una variable en una cadena y tener algo inmediatamente después de que se ve como parte de la variable, pero no es, incluya el nombre de la variable en {}:

print "foo${ids}bar"; 
+0

bueno, preguntando, ¿y si quiero imprimir algo inmediatamente después de la variable, es decir, que quiero lograr esto: 'impresión "Contenido: $ idsHeyIamhere"' – Juto

+0

@Juto: se ha añadido a mi respuesta – ysth

7
¿Cómo imprimo mis $ ids y $ nIds?
print "$ids\n"; 
print "$nIds\n"; 
Probé simplemente print $ids, pero Perl se queja.

¿Qué pasa con qué? Valor sin inicializar? Quizás su bucle nunca se ingresó debido a un error al abrir el archivo. Asegúrese de verificar si open devolvió un error y asegúrese de estar usando use strict; use warnings;.

my ($ids, $nIds) es una lista, ¿verdad? Con dos elementos?

Es una llamada a función (muy especial). $ids,$nIds es una lista con dos elementos.

9

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:

  1. $ids no está definido. Da el aviso undefined value in print
  2. $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.
  3. Olvidó un punto y coma al final de la línea.
  4. 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. 
+0

¿Seguro? Cuando digo '$ array [500] =" yada "' obtengo el valor 501 para 'scalar @ array'. – BarneySchmale

Cuestiones relacionadas