2013-02-01 1 views
1

Я пишу простую программу, которая читает код Морзе из файла и преобразует его в обычный текст. Однако я получаю некоторые сумасшедшие ошибки. Я не очень хорошо знаком с perl, и мне приходится запускать его из командной строки. Ниже приведена ошибка, которую я получаю, и код. Возможно, я просто ошибаюсь. Я печатаю: «perl -w Lott_Morse.pl morse.txt» в командной строке. Любая помощь будет оценена по достоинству.Perl - Ошибка, вызванная неинициализированным значением в печати

Ошибка:

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 

Код:

#!/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}; 
} 

ответ

1

Помните всегда use strict;. Работал хорошо на нескольких ... --- ... в файле (весь код Морзе я знаю):

#!/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"; 
} 
+0

Я не получаю больше ошибок, но это только чтение первой строки в файле .. Это нужно прочитать их все. – JLott

+0

@JLott Использование '<>' в скалярном контексте читает только одну строку. Я бы использовал цикл while (<>), если бы я был вами, и читал строки один за другим. – TLP

+0

@JLott - Приносим извинения за то, что я не понимал, что вы пытаетесь читать из файла. Скорректируйте сценарий для этого. Пожалуйста, подумайте о включении предложений [TLP] (http://stackoverflow.com/users/725418/tlp). – Kenosis

7

Вы читаете в строке, которая не имеет соответствующий ключ в вашем хэше, так что значение хэша не определено (неинициализированный) , Вероятно, это проблема ввода. Попробуйте это для отладки:

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

Для длинных строк, вы могли бы рассмотреть это:

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

Какой будет искать комбинаций точек и тире, и перевести их в текстовый эквивалент, или сами, если нет перевод найден.

Вы должны также рассмотреть возможность сделать ваше назначение хэша немного более удобным для чтения:

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", ".-.-.-" => ".", "--..--" => ",", "..--.." => "?", ".----." => "'", 
    "-....-" => "-", ".-..-." => '"', ".--.-." => "@", "-...-" => "=", "!"  => " " 
); 

Это сделает опечатки намного легче обнаружить. Кроме того, вы можете сделать перевернутую таблицу поиска довольно легко:

my %plain_to_morse = reverse %morse_to_plain; 
+0

Отлично поймать! Или замените один символ (или код) в качестве владельца места для нераспределенного кода. – Kenosis

+0

Отличное предложение! Я буду использовать это для многих других вещей. – JLott