如果我有一个打开文件的子程序,确保它仅在第一次调用子程序时打开它的最佳方法是什么?我有这个,但不确定它的最佳实践:
{
my $count = 0;
sub log_msg {
my ($msg,$name) = @_;
if ($count == 0) {
my $log_file_name = "/tmp/" . $name;
open my $log_fh,">",$log_file_name or croak "couldn't open $log_file_name : $!";
print $log_fh "$timestamp: created and opened $log_file_name\n";
}
$count++;
}
}
最佳答案
听起来是使用状态变量的好理由。将文件句柄存储在持久哈希中。
#!/usr/bin/perl
use 5.010;
use strict;
use warnings;
sub log_msg {
state %fh;
my ($msg, $name) = @_;
unless ($fh{$name}) {
warn "Opening $name\n";
open $fh{$name}, '>', $name or die $!;
print {$fh{$name}} scalar localtime, " Opened file\n";
}
print {$fh{$name}} $msg, "\n";
}
log_msg('Message1', 'first.log');
log_msg('Message2', 'first.log');
log_msg('MessageA', 'second.log');
log_msg('MessageB', 'second.log');
请注意打印调用中文件句柄周围的额外大括号。那是因为 print 对可以用作其文件句柄参数的内容有点挑剔。
关于perl - 仅当文件尚未打开时,如何才能在 Perl 中打开它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3945362/