- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在逐行读取文件,并希望通过子例程处理每一行。由于我对该行本身不感兴趣,所以我将从文件句柄中读取的内容直接放入子例程调用中。但是,这会导致我不太理解的意外行为。
我创建了一个演示效果的最小示例:
#!/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/
我设置了 Helm 柄和 Helm 柄。我有tiller-deploy。昨天,我可以定期运行了。但今天我收到此错误消息 Error: could not find a ready tiller pod
我以前已将分er安装到特定的 namespace 中。 我设置了一个环境变量来设置'tiller'命名空间-但我不记得该环境变量的名称-而且似乎无法通过网络搜索找到它。 这是什么 key ? 最佳答案
当我在 View 模型中使用如下界面时 class MainViewModel @ViewModelInject constructor( private val trafficImagesR
我正在尝试找到如何在某个 fragment 相关场景中定义 Hilt 的解决方案。我有以下设置: Activity 父 fragment 1 子 fragment 1 子 fragment 2 ...
Hilt 指出如果没有@Provides 注解就不能提供这个接口(interface): interface PlannedListRepository { fun getAllLists()
我的问题非常简单明了:两个注释/示例之间有什么区别: 例子一 @Singleton class MySingletonClass() {} @Module @InstallIn(FragmentCom
我是一名优秀的程序员,十分优秀!