gpt4 book ai didi

perl - 文件句柄与子程序调用的意外行为 - 为什么?

转载 作者:行者123 更新时间:2023-12-01 05:35:59 26 4
gpt4 key购买 nike

我正在逐行读取文件,并希望通过子例程处理每一行。由于我对该行本身不感兴趣,所以我将从文件句柄中读取的内容直接放入子例程调用中。但是,这会导致我不太理解的意外行为。

我创建了一个演示效果的最小示例:

#!/usr/bin/perl

use strict;
use warnings;
use Carp;
use English qw( -no_match_vars );

print "This works as expected:\n";

open my $TEST1, '<', 'filetest1.txt' or croak "Can't open filetest1.txt - $ERRNO";

my $line1 = <$TEST1>;
print_line( $line1 );

while ( 1 ) {
last if eof $TEST1;
$line1 = <$TEST1>;
print $line1;
}
close $TEST1;

print "\n";
print "Unexpected effect here:\n";
open my $TEST2, '<', 'filetest1.txt' or croak "Can't open filetest1.txt - $ERRNO";

print_line(<$TEST2>); # this works, but just once

while ( 1 ) {
last if eof $TEST2; # is triggered immediately
print "This is never printed\n";
print_line(<$TEST2>);
}
close $TEST2;

sub print_line {
my $line = shift;
print $line;
return 1;
}

文件test1.txt的内容:

test line 1
test line 2
test line 3
test line 4
test line 5

脚本结果:

This works as expected:
test line 1
test line 2
test line 3
test line 4
test line 5
Unexpected effect here:
test line 1

好像我在子程序调用中直接读取下一行的时候正好工作了一次然后eof就被触发了。我还没有找到对这种影响的任何解释,它迫使我创建变量 $line1 只是为了将行传递给子例程。

我正在寻找为什么会发生这种情况的解释,因此我想了解我可以或不能使用文件句柄做什么的限制。

最佳答案

在您的代码中 print_line(<$FH>);从文件句柄中读取将在 wantarray-mode 中完成,这意味着您不会读取一行,而是整个文件。在您的子例程中,您只需使用第一行并丢弃其余部分。这就是为什么在您遇到第一个循环后文件句柄为空的原因。

您可以只向子例程提供文件句柄并在其中读取一行:

open my $FH , '<' , 'somefile' or die "Cannot read: $!" ;
while( ! eof $FH ) {
print_line( $FH ) ;
}

sub print_line {
my ( $fh ) = @_ ;

my $line = <$fh> ;
print $line ;
}

关于perl - 文件句柄与子程序调用的意外行为 - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34894739/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com