perl - 仅当文件尚未打开时,如何才能在 Perl 中打开它?

标签 perl file subroutine

如果我有一个打开文件的子程序,确保它仅在第一次调用子程序时打开它的最佳方法是什么?我有这个,但不确定它的最佳实践:

{
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/

相关文章:

php - 在第一行 <?php 之后添加一行代码

perl - CGI::Application和SQLite

perl - Perl 有什么好的定时器实现吗?

c - 将结构写入文件 C

c++ - C++ 读取文件某个位置的字节

Fortran 数组和子程序(子数组)

perl - Perl 子程序中的变量不会释放内存

perl - 如何在 ActiveState Perl 中温和地终止进程?

Java 将 xml 文件发布到带有身份验证的 url

perl - 如何将可选参数传递给 Perl 函数?