這是很容易的文件句柄創建變量解決:
sub _init_tmp_db {
my $self = shift;
my $fh;
open $fh, ">", "data.txt"
$self->{temp_db_fh} = $fh;
# Sometime later...
$fh = $self-{temp_db_hf};
print $fh "Bob\n";
}
這是一個問題,因爲解析了print
語法的方式以及語法的早期缺乏。 print
聲明實際上有兩種不同的格式:格式#1是您只需將它傳遞給打印機。格式#2說第一個項目可能是一個文件句柄,剩下的就是你想要打印到文件句柄的東西。如果print
無法輕易確定第一個參數是文件句柄,則失敗。
如果你看看其他語言,他們將使用一個參數來傳遞文件句柄,也可能是要打印的東西。或者在面向對象的語言中,它們將爲文件句柄參數重載>>
。他們會是這個樣子:
print "This is my statement", file=file_handle;
或
print "This is my statement" >> file_handle;
您可能能夠Munge時間的語法使用一個變量脫身。但是,它不會使程序更高效或更易讀,並且可能會使程序更難以維護。所以,只需使用文件句柄的變量。
你說類的標題。我假設你有興趣編寫一個完全面向對象的包來做到這一點。這是一個簡單的例子。通知write
子程序
方法我將文件句柄檢索到一個變量中並使用print
語句中的變量。
#! /usr/bin/env perl
#
use strict;
use warnings;
#######################################################
# MAIN PROGRAM
#
my $file = File->new;
$file->open("OUTPUT") or
die "Can't open 'OUTPUT' for writing\n";
$file->write("This is a test");
#
#######################################################
package File;
use Carp;
sub new {
my $class = shift;
my $self = {};
bless $self, $class;
return $self;
}
sub open {
my $self = shift;
my $file = shift;
my $fh;
if (defined $file) {
$self->{FILE} = $file;
open ($fh, ">", $file) and $self->_fh($fh);
}
return $self->_fh;
}
sub _fh {
my $self = shift;
my $fh = shift;
if (defined $fh) {
$self->{FH} = $fh;
}
return $self->{FH};
}
sub write {
my $self = shift;
my $note = shift;
my $fh = $self->_fh;
print $fh $note . "\n";
return
}
這不會使用'use strict'refs';' – dgw 2012-01-30 14:34:54
我搜索了很多地方,但從來沒有得到那個網頁。多謝。 – 2012-01-30 14:35:50