提问人:mike 提问时间:11/17/2023 更新时间:11/17/2023 访问量:99
如果文件句柄不存在,请打开它,如果存在,请使用它
open filehandle if it doesnt exist, use it if it does
问:
我正在扫描文件以查找某些值。对于其中每个值,我想创建一个输出文件并将匹配的行转储到该特定的输出文件中。这些值事先是未知的,因此当我遇到它们时,我需要使用它们。
为了避免一遍又一遍地打开和关闭文件,我正在尝试测试文件句柄是否存在,如果存在,请写入它。如果没有,请打开它,写入它,然后在再次出现相同的值时再次使用它。
我的脚本失败,出现以下错误:
Scalar found where operator expected at get-authHost2.sh line 31, near ""$_ \n" $filehandle"
(Missing operator before $filehandle?)
Scalar found where operator expected at get-authHost2.sh line 35, near ""$_ \n" $filehandle"
(Missing operator before $filehandle?)
syntax error at get-authHost2.sh line 31, near ""$_ \n" $filehandle"
syntax error at get-authHost2.sh line 35, near ""$_ \n" $filehandle"
这是我到目前为止所拥有的......
use strict; use warnings;
my $outfile; my $filehandle; my $authHost;
my $filename = $1; open(my $fh, '<', $filename) or die "Could not open file '$filename' $!";
while (my $line = <$fh>) { chomp $line;
if (my ($authHost) = $line = /authHost="(.*?)"/ )
{
print "$authHost" ;
$outfile = print "$authHost-auth-events.out" ;
$filehandle = $authHost;
# if filehandle already exists, don't open the file again
if (-f $filehandle) {
print "$line \n" $filehandle;
}
else {
open(my $filehandle, '>>', $outfile) or die "Could not open file '$filename' $!";
print "$line \n" $filehandle;
}
} } close $fh;
我似乎找不到答案。我发现的所有问题都是关于测试文件是否存在......而不是文件句柄本身是否存在。
任何帮助将不胜感激。我不是程序员,所以要温柔一点!:-)
答:
1赞
ikegami
11/17/2023
#1
我的脚本因这些错误而失败
你有倒退的论点。
print "$line \n" $filehandle;
应该是
print $filehandle "$line \n";
如果再次出现相同的值,则稍后再次使用它。
我将使用哈希来存储打开的文件句柄(按文件名键控)。
请记住,进程可以具有的打开文件句柄数是有限制的。
评论
0赞
Zak
11/18/2023
“请记住,一个进程可以拥有的打开文件句柄的数量是有限制的”——我不知道这一点,或者只是没有考虑过——尽管这完全有道理。将好奇的人指向有关文件句柄进程限制的文档将很方便:)
0赞
ikegami
11/18/2023
@Zak,我无法为每个系统提供文档。
0赞
Zak
11/18/2023
不是要说是一句话——但话虽如此,评论是必要的吗?我的意思是警告一个人,第 n 个小部件有第 n 个限制......最终,如果不进行适当的清理/关闭/垃圾收集,您将在任何“系统”上遇到内存边界或处理兔子洞......不言而喻。在这种情况下,是什么让文件句柄不同?
0赞
ikegami
11/18/2023
@Zak,您是否忘记了 OP 特别希望不要关闭(“适当清理”)手柄以便它们可以重复使用?而且限制比“可用内存”小得多。因此警告。
评论
exists
$filehandle = $authHost;
- 您缺少字典循环。 是一个纯字符串,应该是一个文件句柄。我建议一个$authHost
$filehandle
%filename_filehandle_map
$outfile = print "$authHost-auth-events.out"
顺便说一句,没有做你似乎认为的那样。并且有倒退的论点。首先是文件句柄,然后是要打印的数据。print "$line \n" $filehandle;
print