关于chomp的澄清

kre*_*ack 7 perl chomp

我现在正在上课,决定花时间学习Perl.我开头的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";
Run Code Online (Sandbox Code Playgroud)

它只是不起作用.我一直收到此错误消息:

在串联(.)中使用未初始化的值或在hello.plx第17行第1行使用字符串

我尝试了更多的代码,但每个"解决方案"看起来比之前的"解决方案"更复杂.最后,我决定检查答案.

我的代码和答案之间的唯一区别是chomp ($input);后面的存在<STDIN>;.

现在,作者chomp在之前的例子中使用过,但他并没有真正涵盖chomp正在做的事情.所以,我在www.perlmeme.org上找到了这个答案:

chomp()函数将删除(通常)字符串末尾的任何换行符.我们通常说的原因是它实际上删除了与$/(输入记录分隔符)的当前值匹配的任何字符,并$/默认为换行符.


无论如何,我的问题是:

  1. 什么新行被删除?Perl会自动将a附加"\n"到输入<STDIN>吗?我只是有点不清楚,因为当我读到"它实际上删除了与当前值相匹配的任何字符$/"时,我不禁想到"我不记得$/在我的代码中放置任何地方."

  2. 我希望尽快制定最佳实践 - 最好是在不需要的情况下包括chomp之后<STDIN>或者是否存在不必要的情况?

sma*_*ane 9

<STDIN> 读取到输入字符串的末尾,如果按回车键输入它,则包含换行符,您可能会这样做.

chomp删除字符串末尾的换行符. $/是一个变量(如你所发现的,默认为换行符)你可能不必担心; 它只是告诉perl'输入记录分隔符'是什么,我假设它意味着它定义<FILEHANDLE>读取的距离.你现在几乎可以忘记它,它似乎是一个高级主题.只是假装chomp扼杀一个尾随的换行符.老实说,我以前从未听说$/过.

至于你的其他问题,这是一般吸尘器总是终日啃食变量,并添加换行符随后需要的,因为你并不总是知道如果一个变量有一个换行符与否; 通过总是扼杀变量,你总是得到相同的行为.有些情况下它是不必要的,但如果你不确定它不会伤害chomp它.

希望这可以帮助!