use strict;
my @array=('f1','f2','f3');
my $dir ='\tmp';
foreach (@array) {
my $FH = $_;
open ("$FH", ">$dir/${FH}.txt") or die $!;
}
foreach (@array) {
my $FH = $_;
close($FH);
}
我遇到"Can't use string ("f1") as a symbol ref while "strict refs" in use at bbb.pl line 6."
错误。什么是isuse?
答案 0 :(得分:6)
您使用字符串“f1”作为open
的第一个参数,它需要一个文件句柄。
您可能想要这样做:
my @filehandles = (); # Stash filehandles there so as to not lose filenames
foreach (@array) {
my $FH = $_;
open (my $fh, ">", "$dir/${FH}.txt") or die $!;
push @filehandles, $fh;
}
答案 1 :(得分:6)
第一:2 arg open是坏的,3 arg open更好。
open( .. , ">", "$dir/${FN}.txt")
第二,你在做什么打开(“$ FH”..
打开的参数1应该是可以连接到数据流的各种类型的实际文件句柄。传递一个字符串是行不通的。
INSANE: open( "Hello world", .... ) # how can we open hello world, its not a file handle
WORKS: open( *FH,.... ) # but don't do this, globs are package-globals and pesky
BEST: open( my $fh, .... ) # and they close themself when $fh goes out of scope!
第三
foreach my $filename ( @ARRAY ){
}
Forth:
dir = \tmp
?你确定吗?我认为你的意思是/tmp
,\tmp
完全不同。
第五:
use warnings;
使用严格是好的,但你也应该使用警告。
第六:使用名称解释变量,我们知道@是一个数组@array不是更有帮助。
use strict;
use warnings;
my @filenames=('f1','f2','f3');
my @filehandles = ();
my $dir ='/tmp';
foreach my $filename (@filenames) {
open (my $fh,'>', "${dir}/${filename}.txt") or die $!;
push @filehandles, $fh;
}
# some code here, ie:
foreach my $filehandle ( @filehandles ) {
print {$filehandle} "Hello world!";
}
# and then were done, cleanup time
foreach my $filehandle ( @filehandles ){
close $filehandle or warn "Closing a filehandle didn't work, $!";
}
或者,根据您的尝试,这可能是更好的代码:
use strict;
use warnings;
my @filenames=('f1','f2','f3');
my $dir ='/tmp';
foreach my $filename (@filenames) {
open (my $fh,'>', "${dir}/${filename}.txt") or die $!;
print {$fh} "Hello world!";
}
我没有明确关闭$ fh,因为它不需要,只要$ fh超出范围(在这种情况下在块的末尾),它就会自动关闭。