/ / Perl: error causado por un valor no inicializado en la impresión: perl, archivo-io, errores del compilador, terminal, padre

Perl - Error causado por el valor no inicializado en la impresión - perl, file-io, errores del compilador, terminal, padre

Estoy escribiendo un programa sencillo que lee morse.código de un archivo y lo convierte en texto sin formato. Estoy recibiendo algunos errores locos sin embargo. No estoy muy familiarizado con perl y tengo que ejecutarlo desde la línea de comandos. A continuación se muestra el error que estoy recibiendo y el código. Es posible que lo esté ejecutando mal. Estoy escribiendo: "perl -w Lott_Morse.pl morse.txt" en la línea de comandos. Cualquier ayuda sería apreciada.

Error:

Use of uninitialized value in print at Lott_CSC360_Morse2.pl line 31, <> line 7.
Use of uninitialized value in print at Lott_CSC360_Morse2.pl line 31, <> line 7.
Use of uninitialized value in print at Lott_CSC360_Morse2.pl line 31, <> line 7.
Use of uninitialized value in print at Lott_CSC360_Morse2.pl line 31, <> line 7.
Use of uninitialized value in print at Lott_CSC360_Morse2.pl line 31, <> line 7.
Use of uninitialized value in print at Lott_CSC360_Morse2.pl line 31, <> line 7.
The message is 0Jessicas-MacBook-Pro:Documents

Código:

#!/usr/bin/perl

use 5.010;
use warnings;

%morse_to_plain=(
".-" =>"A", "-..." => "B", "-.-." => "C", "-.." => "D", "." => "E",
"..-." => "F", "--." => "G", "...." => "H", ".." => "I", ".---" => "J",
"-.-" => "K", ".-.." => "L", "--" => "M", "-." => "N", "---" => "O",
".--." => "P", "--.-" => "Q", ".-." => "R", "..." => "S", "-" => "T",
"..-" => "U", "...-" => "V", ".--" => "W", "-..-" => "X", "-.--" => "Y",
"--.." => "Z", "-----" => "0", ".----" => "1", "..---" => "2", "...--" => "3",
"....-" => "4", "....." => "5", "-...." => "6", "--..." => "7", "---.." => "8",
"----." => "9", ".-.-.-" => ".", "--..--" => ",", "..--.." => "?", ".----." => """,
"-....-" => "-", ".-..-." => """, ".--.-." => "@", "-...-" => "=", "!" => " "
);



chomp(@message = <>);



print "The message is ";
foreach $char (@message)
{
print $morse_to_plain{$char};
}

Respuestas

1 para la respuesta № 1

Recuerda siempre use strict;. Funcionó bien en múltiples ... --- ... en un archivo (todo el código Morse que conozco):

#!/usr/bin/perl

use 5.010;
use strict;
use warnings;

my %morse_to_plain=(
".-" =>"A", "-..." => "B", "-.-." => "C", "-.." => "D", "." => "E",
"..-." => "F", "--." => "G", "...." => "H", ".." => "I", ".---" => "J",
"-.-" => "K", ".-.." => "L", "--" => "M", "-." => "N", "---" => "O",
".--." => "P", "--.-" => "Q", ".-." => "R", "..." => "S", "-" => "T",
"..-" => "U", "...-" => "V", ".--" => "W", "-..-" => "X", "-.--" => "Y",
"--.." => "Z", "-----" => "0", ".----" => "1", "..---" => "2", "...--" => "3",
"....-" => "4", "....." => "5", "-...." => "6", "--..." => "7", "---.." => "8",
"----." => "9", ".-.-.-" => ".", "--..--" => ",", "..--.." => "?", ".----." => """,
"-....-" => "-", ".-..-." => """, ".--.-." => "@", "-...-" => "=", "!" => " "
);

print "The message is n";

while (<>) {
chomp;
foreach my $char ( split " " ) {
print $morse_to_plain{$char};
}
print "n";
}

7 para la respuesta № 2

Estás leyendo en una cadena que no tiene una clave coincidente en tu hash, por lo que el valor de hash no está definido (no está inicializado). Es probable que sea un problema de entrada. Intenta esto para propósitos de depuración:

print $morse_to_plain{$char} // "Key does not exist: "$char"n";

Para cadenas más largas, podría considerar esto:

$string =~ s{([-.]+)}{ $morse_to_plain{$1} // $1 }ge;

Que buscará combinaciones de puntos y guiones y los traducirá a su equivalente de texto, o ellos mismos si no se encuentra una traducción.

También deberías considerar hacer que tu asignación de hash sea un poco más legible:

my %morse_to_plain = (
".-"     => "A", "-..."   => "B", "-.-."   => "C", "-.."    => "D", "."      => "E",
"..-."   => "F", "--."    => "G", "...."   => "H", ".."     => "I", ".---"   => "J",
"-.-"    => "K", ".-.."   => "L", "--"     => "M", "-."     => "N", "---"    => "O",
".--."   => "P", "--.-"   => "Q", ".-."    => "R", "..."    => "S", "-"      => "T",
"..-"    => "U", "...-"   => "V", ".--"    => "W", "-..-"   => "X", "-.--"   => "Y",
"--.."   => "Z", "-----"  => "0", ".----"  => "1", "..---"  => "2", "...--"  => "3",
"....-"  => "4", "....."  => "5", "-...."  => "6", "--..."  => "7", "---.."  => "8",
"----."  => "9", ".-.-.-" => ".", "--..--" => ",", "..--.." => "?", ".----." => """,
"-....-" => "-", ".-..-." => """, ".--.-." => "@", "-...-"  => "=", "!"      => " "
);

Hará que los errores tipográficos sean mucho más fáciles de detectar. Además, puedes hacer la tabla de búsqueda invertida con bastante facilidad:

my %plain_to_morse = reverse %morse_to_plain;