perl - 关于 chomp 的澄清

标签 perl chomp

我现在正在课间休息,决定花时间学习 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..



无论如何,我的问题是:
  • 哪些换行符被删除? Perl 是否会自动附加 "\n"到来自 <STDIN> 的输入?我只是有点不清楚,因为当我读到“它实际上删除了与 $/ 的当前值匹配的任何字符”时,我不禁想到“我不记得在我的代码中的任何位置放置了 $/ .”
  • 我想尽快制定最佳实践 - 最好总是包含 chomp之后 <STDIN>或者有没有不必要的场景?
  • 最佳答案

    <STDIN>读取到输入字符串的末尾,如果您按回车键输入它,则其中包含一个换行符,您可能会这样做。
    chomp删除字符串末尾的换行符。 $/是一个变量(如您所见,默认为换行符),您可能不必担心;它只是告诉 perl 什么是“输入记录分隔符”,我假设这意味着它定义了多远 <FILEHANDLE>读。您现在几乎可以忘记它,这似乎是一个高级主题。就假装chomp砍掉一个尾随的换行符。老实说,我什至从未听说过 $/前。

    至于您的另一个问题,通常更清晰地处理变量并稍后根据需要添加换行符,因为您并不总是知道变量是否有换行符;通过总是 chomping 变量,你总是会得到相同的行为。有些情况下它是不必要的,但如果你不确定它不会伤害 chomp它。

    希望这可以帮助!

    关于perl - 关于 chomp 的澄清,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7290445/

    相关文章:

    Java 如何从字符串中删除回车符 (HEX 0A)?

    ruby - 如果没有该特定行,我的代码将无法工作。为什么?

    perl - 时区应该是常量还是变量?

    java - 从 Java 程序调用时 Perl 脚本未完全执行

    perl - 有条件的 Perl Shebang?

    perl - 如何使用 Perl、DBI 和占位符插入到 PostgreSQL 中?

    perl - Perl 中的 chomp 未按预期工作

    ruby - sublime text 看不懂gets.chomp

    perl - 我们在Perl中有自动冠军吗?

    Perl:表达式优​​先级和评估