Bất cứ khi nào tôi muốn mô phỏng đầu vào và đầu ra cho một filehandle, tôi sẽ thường xuyên sử dụng tài liệu tham khảo để DATA
và STDOUT
tương ứng:Sự khác nhau giữa * DATA và * DỮ LIỆU
use strict;
use warnings;
use autodie;
#open my $infh, '<', 'infile.txt';
my $infh = \*DATA;
#open my $outfh, '>', 'outfile.txt';
my $outfh, \*STDOUT;
print $outfh <$infh>;
__DATA__
Hello World
Đầu ra:
Hello World
Tuy nhiên, trong một số recent answer bởi Borodin, nó đã được chứng minh rằng nó không thực sự cần thiết để tham khảo. Thay vào đó, một nhiệm vụ đơn giản là đủ:
my $infh = *DATA;
Vì vậy, tôi đã tạo ra kịch bản sau đây để so sánh và đối chiếu sự khác biệt giữa hai phương pháp:
use strict;
use warnings;
use Fcntl qw(:seek);
# Compare Indirect Filehandle Notation
my %hash = (
'\*DATA' => \*DATA,
'*DATA' => *DATA,
);
my $pos = tell DATA;
my $fmt = "%-8s %-22s %-7s %s\n";
printf $fmt, qw(Name Value ref() readline());
while (my ($name, $fh) = each %hash) {
seek($fh, $pos, SEEK_SET); # Rewind FH
chomp(my $line = <$fh>);
printf $fmt, $name, $fh, ref($fh), $line;
}
__DATA__
Hello World
Đầu ra:
Name Value ref() readline()
\*DATA GLOB(0x7fdc43027e70) GLOB Hello World
*DATA *main::DATA Hello World
Khi nó đi qua và đọc từ filehandle, không có sự khác biệt giữa typeglob và tham chiếu đến typeglob.
Chuyển từ thử nghiệm mẫu nghiên cứu điều tra cho thấy các trang perldoc sau:
Tham chiếu đầu tiên cho thấy một trong hai cách sử dụng. Trong khi thứ hai đưa ra một danh sách các lựa chọn thay thế khác, nhưng đề cập đến cách ký hiệu tham chiếu là cần thiết nếu chúng ta muốn ban phước cho biến đó. Không có sự khác biệt nào khác được đề xuất.
Có sự khác biệt về phong cách chức năng hoặc ưa thích của hai tệp gián tiếp gián tiếp này không?
my $fh = \*DATA;
my $fh = *DATA;
Phản ứng tức thì của tôi là mọi nhân vật phụ đều bổ sung thêm chút tiềm năng cho sự nhầm lẫn ở đâu đó trên đường ... – abiessu
nhiều nơi cũng chấp nhận một ioref ('* DATA {IO}') – ysth
@abiessu, tôi muốn nói mà không phù hợp với những gì 'mở $ fh' trả về của tôi thực sự có nhiều khả năng gây nhầm lẫn. – ikegami