从 file/pipe 中读取一行并在 while 循环中重复使用
Read one line from file/pipe and reuse it in a while loop
我有一个文件句柄可以从文件或管道中读取数据。首先,我从文件句柄中读取了一行。然后,我需要执行一个 while
循环,同时考虑到先前读取的行。我认为 seek
function 与管道有问题。
所以我的伪代码是
local $line = <INPUT>;
seek(INPUT, -length($line), 1);
# if block
while (<INPUT>) {
}
也许有这样的解决方案?
while ($line, <INPUT>) {
}
只要记住变量中的第一行。在循环结束时从文件句柄读取下一行:
#!/usr/bin/perl
use warnings;
use strict;
open my $FH, '-|', 'echo 3 ; seq 1 10' or die $!;
if (defined( my $first = <$FH> )) {
my $line = $first;
while () {
chomp $line;
print "$line:$first";
last if eof $FH;
$line = <$FH>;
}
}
向后看:
my $prev;
while (defined( my $line = <> )) {
... Use $prev and $line. $prev might not be defined. ...
$prev = $line;
}
期待:
my $line = <>;
while (defined($line)) {
my $next = <>;
... Use $line and $next. $next might not be defined. ...
$line = $next;
}
成对:
if (defined( my $line1 = <> )) {
while (defined( my $line2 = <> )) {
... Use $line1 and $line2. Both will be defined. ...
$line1 = $line2;
}
}
很大程度上取决于你为什么要这样做。最简单的方法就是编写一个 while read 循环并在第一次执行时保存该行。可能不需要读取第一行,然后再将其送入读取循环
也许是这样的
my $first_line;
while ( <> ) {
$first_line //= $_;
# Process $_
}
我有一个文件句柄可以从文件或管道中读取数据。首先,我从文件句柄中读取了一行。然后,我需要执行一个 while
循环,同时考虑到先前读取的行。我认为 seek
function 与管道有问题。
所以我的伪代码是
local $line = <INPUT>;
seek(INPUT, -length($line), 1);
# if block
while (<INPUT>) {
}
也许有这样的解决方案?
while ($line, <INPUT>) {
}
只要记住变量中的第一行。在循环结束时从文件句柄读取下一行:
#!/usr/bin/perl
use warnings;
use strict;
open my $FH, '-|', 'echo 3 ; seq 1 10' or die $!;
if (defined( my $first = <$FH> )) {
my $line = $first;
while () {
chomp $line;
print "$line:$first";
last if eof $FH;
$line = <$FH>;
}
}
向后看:
my $prev;
while (defined( my $line = <> )) {
... Use $prev and $line. $prev might not be defined. ...
$prev = $line;
}
期待:
my $line = <>;
while (defined($line)) {
my $next = <>;
... Use $line and $next. $next might not be defined. ...
$line = $next;
}
成对:
if (defined( my $line1 = <> )) {
while (defined( my $line2 = <> )) {
... Use $line1 and $line2. Both will be defined. ...
$line1 = $line2;
}
}
很大程度上取决于你为什么要这样做。最简单的方法就是编写一个 while read 循环并在第一次执行时保存该行。可能不需要读取第一行,然后再将其送入读取循环
也许是这样的
my $first_line;
while ( <> ) {
$first_line //= $_;
# Process $_
}