gpt4 book ai didi

perl - (空?)readline 的返回未被控制结构捕获

转载 作者:行者123 更新时间:2023-12-02 15:19:01 27 4
gpt4 key购买 nike

我有一个多维散列,包含在 SEEK_END 上打开的文件句柄,目的是始终读取最新行而不会获得太多 I/O(我会用 tail).

我现在使用 for 循环遍历所有这些句柄,并对它们调用 readline

看起来像这样:

for $outer ( keys %config ) {

my $line = readline($config{$outer}{"filehandle"});

if (not defined $line || $line eq '' ){
next;
}
else{
print "\nLine: -->".$line."<--\n";
$line =~ m/(:)(\d?\.?\d\d?\d?\d?\d?)/;
$wert = $2;
}
}

如果将新内容写入这些文件,我的脚本会读取它并按计划运行。

问题是 readline 通常不会返回任何内容,因为当前文件末尾没有任何内容,但我的 if 似乎没有识别空返回of readline as undef as empty -- 它什么都不打印,这是正确的,因为这个字符串中没有任何内容,但我不希望它被处理完全没有。

最佳答案

这是一个运算符优先级问题。你混合使用了低优先级 not 和高优先级 || 所以你的条件

not defined $line || $line eq ''

被解析为

not(  defined($line)  ||  ($line eq '')  )

错误地否定了 $line eq '' 部分

使用优先级较低的andor通常更安全,not优于&&||!,但混合使用是一个非常糟糕的主意

你可以这样写

if (not defined $line or $line eq '' ) {
...
}

if ( ! defined $line || $line eq '' ) {
...
}

一切都会好起来的


我更愿意看到它这样写,因为它去掉了不必要的 else 子句和 next 语句,并丢弃了只包含空格字符的行

另请注意,我遍历了散列的 values。当键仅用于访问值时,使用键是一种浪费。您可能会为循环控制变量 $item

想出更好的名称

当 Perl 将变量直接插入双引号字符串时,通常不需要连接运算符

for my $item ( values %config ) {

my $line = readline( $item->{filehandle} );

if ( defined $line and $line =~ /\S/ ) {

print "\nLine: -->$line<--\n";

$line =~ m/(:)(\d?\.?\d\d?\d?\d?\d?)/;
$wert = $2;
}
}

关于perl - (空?)readline 的返回未被控制结构捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38631070/

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