【问题标题】:Compilation Error: Requires Explicit Package Name编译错误:需要明确的包名称
【发布时间】:2013-01-22 09:26:12
【问题描述】:

我刚开始使用 Perl,我正在编写一个程序来读取一个文件并将该文件中的莫尔斯电码转换为另一个文件中的纯文本。我收到此错误,我无法弄清楚出了什么问题。任何帮助表示赞赏!

我收到的错误:

Jessicas-MacBook-Pro:Documents jessica$ perl -w Morse_to_Text.pl <Morse3.rtf> MorseTest.txt
Global symbol "$message" requires explicit package name at Morse_to_Text.pl line 20.
Global symbol "$message" requires explicit package name at Morse_to_Text.pl line 26.
Global symbol "$message" requires explicit package name at Morse_to_Text.pl line 26.
Global symbol "$message" requires explicit package name at Morse_to_Text.pl line 27.

代码:

#!/usr/bin/perl 

 use 5.010;
 use strict;
 use warnings;


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


while (<>) {
    chomp;
    foreach my $char ( split ' ' ) {

        $message = $morsecode{$char} + $message;
        print $message;
    };
}

【问题讨论】:

  • 请注意,. 是字符串连接运算符。 perlop.
  • 如果要将字符串拆分为字符,则需要split //
  • 你能详细说明一下。是字符串连接。我在您提供的文档中找不到它
  • "a" + "b" 给出零。 “一种” 。 “b”给出“ab”。在“加法运算符”下提到。
  • 谢谢!很高兴知道哈哈!

标签: perl file file-io compiler-errors


【解决方案1】:

你使用 strict,所以你应该先声明全局变量 $message。但正如 ikegami 在评论中所说,使用严格和警告是编写 perl 代码时的最佳实践之一。编译指示会更快地捕获许多错误,否则它们会被捕获,这样可以更容易地找到错误的根本原因(就像您提供的错误一样)。根本原因可能是需要进行错误或验证检查,无论程序员的技能如何,这都可能发生。

我想你想要的是下面的代码:

#!/usr/bin/perl 

 use 5.010;
 use strict;
 use warnings;


my %morsecode=(
".-" =>"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 $message;

while (<>) {
    chomp;
    foreach my $char ( split ' ' ) {
        $message = $message.$morsecode{$char};
    };
}

print $message."\n";

【讨论】:

  • 我故意没有为他写出解决方案,因为他显然在努力学习。
  • 我什至不认为你做得对。将所有输入行的输出合并为一行输出似乎不太对。
  • 另外,你错误地暗示声明$message 是他只在严格时才应该做的事情。这并不是说你听起来好像在程序中不使用 strict 有时是可以接受的。
  • 谢谢,我会编辑这个答案。代码仅供参考。如果他不想将结果放在一行中,他可以根据它进行修改。
  • 非常感谢!我根本没有使用连接方法哈哈。
【解决方案2】:

这意味着您没有在适当的情况下使用my $message; 声明$message


您可能会从使用运行脚本中受益

perl -Mdiagnostics script.pl

它将解释许多警告/错误。

【讨论】:

  • 太棒了!这真的很有帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-30
  • 2022-11-14
  • 1970-01-01
相关资源
最近更新 更多