我正在努力教自己Perl和我一直在努力…昨晚我做了一个程序来计算用户提供的一组数字的平均值,以便了解列表和用户输入所以今天我想我会做莫尔斯码解码器,了解哈希.我仔细阅读了我买的这本书并没有真正解释哈希……它实际上并没有很好地解释很多事情.任何帮助,将不胜感激!
无论如何,我想编写一个解码用户输入的莫尔斯代码的程序.所以用户会输入:
-.-. .- - ... ! .-. ..- .-.. .
感叹号将代表一个单独的词.此消息将向用户返回“Cats Rule”.下面是我到目前为止的代码……记住..我已经在perl编程了不到24小时哈哈.
码:
use 5.010; 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','.----' =>'1','..---' =>'2','...--' =>'3','....-' =>'4','.....' =>'5','-....' =>'6','--...' =>'7','---..' =>'8','----.' =>'9','-----' =>'0','.-.-.-'=>'.','--..--'=>',','---...'=>':','..--..'=>'?','.----.'=>'\'','-...-' =>'-','-..-.' =>'/','.-..-.'=>'\"' ); my @k = keys %morsecode; my @v = values %morsecode; say "Enter a message in morse code separated by a line. Use the exclamation point (!) to separate words. Hit Control+D to signal the end of input."; my @message = <STDIN>; chomp @message; my $decodedMessage = encode(@message); sub encode { foreach @_ { if (@_ == @k) { return @k; #This is where I am confused... I am going to have to add the values to an array,but I don't really kNow how to go about it. } else if(@_ == '!') {return ' '} else { return 'Input is not valid'; } } }
解决方法
您的代码包含两个语法错误:foreach需要一个列表来迭代;这意味着parens.与C和其他语言不同,Perl不支持else(…).相反,使用elsif(…).
然后有一些语义错误:迭代的当前值存储在$_中.数组@_包含对函数调用的参数.
Perl以不同的方式比较字符串和数字:
Strings Numbers eq == lt < gt > le <= ge >= ne != cmp <=>
对于手头的任务,使用正确的运算符,在这种情况下,是严格的运算符.
(你的代码@_ == @k做了一些事情,即在数字上下文中使用数组.这会产生元素的数量,随后进行比较.@_ ==’!’只是很奇怪.)
你真正想要做的是将输入的值映射到一个字符列表.您的哈希定义了此映射,但我们想要应用它. Perl有一个map函数,它的工作原理就像
@out_list = map { ACTION } @in_list;
在操作块内,当前值可用作$_.
我们希望我们的操作在哈希中查找适当的值,或者如果输入字符串没有映射,则包含错误消息:
my @letters = map { $morsecode{$_} // "<unkNown code $_>" } @message;
这假定!被注册为morsecode哈希中的空格.
然后我们通过将它们与空字符串连接来制作这些字母的单个字符串:
my $translated_message = join "",@letters;
别忘了打印出结果!
完整的代码:
#!/usr/bin/perl use strict; use warnings; use 5.012; my %morsecode=( '.-' =>'A','.' =>'E','-' =>'T','.-..-.'=>'"','!' =>' ',); say "Please type in your morse message:"; my @codes = <>; chomp @codes; my $message = join "",map { $morsecode{$_} // "<unkNown code $_>" } @codes; say "You said:"; say $message;
这产生了所需的输出.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。