enn*_*ler 5 perl file subroutine
如果我有一个打开文件的子程序,那么只有在第一次调用subrountine时才能确保它打开它的最佳方法是什么?我有这个但不确定它是否是最佳实践:
{
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++;
}
}
Run Code Online (Sandbox Code Playgroud)
听起来像是使用状态变量的一个很好的理由.将文件句柄存储在持久性哈希中.
#!/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');
Run Code Online (Sandbox Code Playgroud)
请注意打印调用中文件句柄周围的额外括号.那是因为print对你可以用作filehandle参数的内容有点挑剔.
| 归档时间: |
|
| 查看次数: |
261 次 |
| 最近记录: |