này có thể dễ dàng giải quyết bằng cách tạo ra một biến cho một tập tin xử lý:
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";
}
Đây là một vấn đề bởi vì cách cú pháp print
được phân tích cú pháp và sự sloppiness sớm của cú pháp. Câu lệnh print
có hai định dạng riêng biệt: Định dạng # 1 là bạn chỉ đơn giản là truyền nội dung đó để in. Định dạng # 2 nói rằng mục đầu tiên có thể là một tập tin xử lý, và phần còn lại là những thứ bạn muốn in vào tập tin xử lý. Nếu print
không thể dễ dàng xác định rằng tham số đầu tiên là một tập tin xử lý, nó không thành công.
Nếu bạn nhìn vào các ngôn ngữ khác, họ sẽ sử dụng thông số để truyền xử lý tệp và có thể in nội dung. Hoặc trong các ngôn ngữ hướng đối tượng, chúng sẽ quá tải >>
cho tham số xử lý tệp. Họ sẽ trông giống như thế này:
print "This is my statement", file=file_handle;
hoặc
print "This is my statement" >> file_handle;
Bạn có thể có thể munge cú pháp để tránh xa sử dụng một biến. Tuy nhiên, nó không làm cho chương trình hiệu quả hơn hoặc dễ đọc hơn, và có thể đơn giản làm cho chương trình khó duy trì hơn. Vì vậy, chỉ cần sử dụng một biến cho xử lý tập tin.
Bạn nói lớp trong tiêu đề của bạn. Tôi giả sử rằng bạn quan tâm đến việc viết một gói hướng đối tượng đầy đủ fledge để làm điều này. Đây là một ví dụ nhanh. Lưu ý trong phương thức write
chương trình con
Tôi truy xuất trình xử lý tệp thành một biến và sử dụng biến trong câu lệnh 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
}
Nguồn
2012-01-30 15:48:11
Điều này sẽ không hoạt động với 'sử dụng nghiêm ngặt' refs ';' – dgw
Tôi đã tìm kiếm nhiều địa điểm nhưng chưa bao giờ có trang đó. Cảm ơn nhiều. –