无与伦比的字符串的内容

时间:2017-12-05 13:59:11

标签: regex perl io

我正在解析来自stdin的输入,其格式如下:

1
2
3
done

我目前的代码是:

while(<> =~ /(\d+)/) {
    # do something with $1
}
# I want to access the line following the last number here

对于文件的第1部分(带有数字列表)很好。 但是,我希望该行的内容紧跟在最后一个数字之后。

有没有优雅的方法呢?

3 个答案:

答案 0 :(得分:3)

您可以使用:

my $line;
while( ($line = <>) =~ /^(\d+)$/ ) {
  # do something with $1
}
chomp $line;
# Do something with $line (done)

另一个答案指出,使用chomp输入行是个好主意。它将以独立于平台的方式处理换行符char或chars。如果您使用正则表达式匹配数字,$1将&#34;清理&#34;。

另外,如另一个答案所述,/(\d+)/将匹配该行中任意位置的数字。 /^(\d+)$/将匹配仅包含数字的行。

另一种方式:

foreach my $line (<>) {
  if( $line =~ /^(\d+)$/ ) {
    # Do something with $1
  }
  else {
    chomp $line;
    # Do something with $line (done)
  }
}

这将让您处理多个甚至交替的数字和其他文本行。

答案 1 :(得分:1)

while (<>) {
    chomp;
    last if !/^\d+\z/;

    ... $_ ...
}

die("Premature EOF") if !defined($_);

... $_ ...

答案 2 :(得分:0)

你可以这样做

my $var = <>;
chomp $var;

while($var =~ /^(\d+)$/) 
{
    #here do stuff with $var, containing only numbers

    $var = <>;
    chomp $var;
}

# here do stuff with $var, containing now a word

其他事项:通过更改/(\d+)/ /^(\d+)$/,确保您的条目仅包含数字;)