我现在正在课间休息,决定花时间学习 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";
这根本行不通。我不断收到此错误消息:
Use of uninitialized value in concatenation (.) or string at hello.plx line 17, line 1
我尝试更多地使用代码,但每个“解决方案”看起来都比它之前的“解决方案”更复杂。最后,我决定检查答案。
我的代码和答案之间的唯一区别是
chomp ($input);
的存在之后 <STDIN>;
.现在,作者使用了
chomp
在前面的例子中,但他并没有真正涵盖 chomp
正在做。所以,我在 www.perlmeme.org 上找到了这个答案:The
chomp()
function will remove (usually) any newline character from the end of a string. The reason we say usually is that it actually removes any character that matches the current value of$/
(the input record separator), and$/
defaults to a newline..
无论如何,我的问题是:
"\n"
到来自 <STDIN>
的输入?我只是有点不清楚,因为当我读到“它实际上删除了与 $/
的当前值匹配的任何字符”时,我不禁想到“我不记得在我的代码中的任何位置放置了 $/
.” chomp
之后 <STDIN>
或者有没有不必要的场景? 最佳答案
<STDIN>
读取到输入字符串的末尾,如果您按回车键输入它,则其中包含一个换行符,您可能会这样做。chomp
删除字符串末尾的换行符。 $/
是一个变量(如您所见,默认为换行符),您可能不必担心;它只是告诉 perl 什么是“输入记录分隔符”,我假设这意味着它定义了多远 <FILEHANDLE>
读。您现在几乎可以忘记它,这似乎是一个高级主题。就假装chomp
砍掉一个尾随的换行符。老实说,我什至从未听说过 $/
前。
至于您的另一个问题,通常更清晰地处理变量并稍后根据需要添加换行符,因为您并不总是知道变量是否有换行符;通过总是 chomping 变量,你总是会得到相同的行为。有些情况下它是不必要的,但如果你不确定它不会伤害 chomp
它。
希望这可以帮助!
关于perl - 关于 chomp 的澄清,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7290445/