В perl, как читать из STDIN, пока мы не встретим пробел или символ новой строки? - PullRequest
3 голосов
/ 07 января 2012

В Perl, я только знаком с использованием обычного

chomp(my $ip = <>);

Если этот $ ip - это «слова, разделенные пробелом», я должен был бы использовать split для получения «слов», «разделенных», «по» и «пробел».

Есть ли способ прочитать слово за словом?

Ответы [ 2 ]

6 голосов
/ 07 января 2012

Установка разделителя входной записи $/ на пробел будет читать «слово за словом».Вы можете найти результаты нелогичными, поэтому будьте осторожны с тем, что вы хотите .

Попробуйте, например:

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
4 голосов
/ 07 января 2012

Вы можете изменить разделитель входной записи $/ на пробел.(Я не рекомендую делать это, прочитайте до конца)

#!/usr/bin/perl
use strict;

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

В этом случае ввод разделяется пробелами , но не символами новой строки .Аналогично, chomp использует значение разделителя записей, поэтому это дает вам (для нескольких строк):

  • Слово, заканчивающееся строкой, не отделено от слова, начинающего следующую строку.Вы можете обойти это, заканчивая строки пробелом, но это неудобно.
  • Вам все еще нужно избавиться от символа новой строки, который не будет удален chomp.

Таким образом, в конце концов, если у вас больше одной строки, вам лучше сохранить разделитель записей по умолчанию и разделить строки на слова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...