在perl中,如何在遇到空格或换行符之前从STDIN读取?

时间:2012-01-07 10:42:29

标签: perl stdin

在perl中,我只熟悉使用通常的

chomp(my $ip = <>);

如果这个$ ip是“以空格分隔的单词”,我必须使用split来获得“单词”,“分开”,“通过”和“空格”。

首先,有没有办法逐字阅读?

2 个答案:

答案 0 :(得分:6)

将输入记录分隔符$/设置为空格将逐字逐句显示。您可能会发现结果违反直觉,因此要小心您希望的

试着举例:

perl -nwe 'BEGIN { $/ = " ";} print "Line: $_"'

它将从标准输入读取,并将其打印回给您,但当时只有一个字。但是,正如您将注意到的那样,换行(按ENTER键)仍然是该过程中不可或缺的一部分。

然而,

$/不能聪明。它只是我们用来区分输入记录的字符,它确实影响了除STDIN之外的许多其他东西,因此使用它很可能会让你感到困惑。当然,除非您在本地使用它,并且只在您想要的地方使用它。

{  # make this part lexically scoped
    local $/ = " ";  # use local version of $/
    while (<>) {
        chomp(my $ip = $_);  # note that chomp removes space instead
    }
}  # End of scope, $/ is back to normal

答案 1 :(得分:4)

您可以将输入记录分隔符$/更改为空格。 (我不建议这样做,读到最后)

#!/usr/bin/perl
use strict;

open(my $in, "<", "data.txt") or die "can't open input: $!";
local $/ = " ";
while(<$in>) {
    chomp;
    print "\'$_\'\n";
}

在这种情况下,输入由空格分隔,但不是换行符。类似地,chomp使用记录分隔符的值,因此这给你(对于多行):

  • 结束一行的单词与开始下一行的单词没有分开。你可以通过用空格结束行来解决这个问题,但那很尴尬。
  • 你仍然需要摆脱新行字符,这不会被chomp删除。

所以最后,如果你有一行以上,你通常会更好地保留默认记录分隔符并将这些行分成单词。