Ну, для начала, вы неправильно используете 'open'.
open my $fp , '>', 'xyz' ;
Рекомендуемый синтаксис.
Настоятельно рекомендуется использовать оголенное «FP», поскольку оно не является лексическим.
Во-вторых, вы открываете файловые указатели как новые вещи. Это не очень хорошая практика, это не должно быть проблемой, но это просто плохая идея. Вы должны закрыть указатель файла или позволить ему выйти из области видимости (через лексический).
В-третьих, «* STDOUT» является ссылкой.
my $fh = *STDOUT;
print "$fh\n"; #prints '*main::STDOUT';
Итак, когда вы делаете это:
open $fh, '>abc';
вы делаете
open *STDOUT, '>abc';
и если вы сразу после этого сделаете
print "$fh\n";
вы заметите, что он все еще печатает *main::STDOUT
;
Некоторые интересные фрагменты кода, которые проясняют это:
my $fh = *STDOUT;
open $fh, '<', "foo.txt";
print $fh "hello";
# Filehandle STDOUT opened only for input at (eval 288) line 6.
my $fh = *STDIN;
open $fh, '<', "foo.txt";
print <>;
# contents of foo.txt here
Вот рекомендуемый способ использования open:
sub foo {
my $fh;
open $fh , '<', 'file.txt' or Carp::croak('Cannot Open File.txt');
# do stuff with $fh;
close $fh or Carp::carp('Something annoying in close :S ');
}
Обратите внимание, что если вы опустите close, файл закроется, как только $ fh выйдет из видимости.