我现在正在课间休息,并决定花时间学习 Perl。我正在使用Beginning Perl ( http://www.perl.org/books/beginning-perl/ ),并且正在完成第三章末尾的练习。
其中一个练习要求我“将您的重要电话号码存储在散列中。编写一个程序以根据该人的姓名查找号码。”
无论如何,我想出了这个:
#!/usr/bin/perl
use warnings;
use strict;
my %name_number=
(
Me => "XXX XXX XXXX",
Home => "YYY YYY YYYY",
Emergency => "ZZZ ZZZ ZZZZ",
Lookup => "411"
);
print "Enter the name of who you want to call (Me, Home, Emergency, Lookup)", "\n";
my $input = <STDIN>;
print "$input can be reached at $name_number{$input}\n";
它就是行不通。我不断收到此错误消息:
在 hello.plx 第 17 行第 1 行的串联 (.) 或字符串中使用未初始化的值
我尝试更多地使用代码,但每个“解决方案”看起来都比它之前的“解决方案”更复杂。最后,我决定检查答案。
我的代码和答案之间的唯一区别是chomp ($input);
after的存在<STDIN>;
。
现在,作者chomp
在前面的例子中使用过,但他并没有真正涵盖chomp
在做什么。所以,我在 www.perlmeme.org 上找到了这个答案:
该
chomp()
函数将(通常)从字符串末尾删除任何换行符。我们通常说的原因是它实际上删除了与$/
(输入记录分隔符)的当前值匹配的任何字符,并且$/
默认为换行符。
无论如何,我的问题是:
删除了哪些换行符?Perl 会自动将 a 添加
"\n"
到来自 的输入<STDIN>
吗?我只是有点不清楚,因为当我读到“它实际上删除了任何与”的当前值匹配的字符时$/
,我不禁想“我不记得$/
在我的代码中的任何地方放了一个”。我想尽快制定最佳实践 - 最好总是
chomp
在之后包含,<STDIN>
或者是否存在不必要的场景?