我有一个大数据文件dump.all.lammpstrj
,我需要将其拆分/分类为一系列文件,例如Z_1_filename
,Z_2_filename
,Z_3_filename
等等。每条记录中的坐标。
坐标以无序方式保存,因此我的程序会读取每一行并确定应将此记录发送到哪个文件。
我使用变量$filehandle = "Z_$i_DUMP"
我希望打开所有可能的文件
for ( my $i = 1; $i <= 100; $i++ ) {
$filehandle = "Z_$i_DUMP";
open $filehandle,'>', "Z_$i_dump.all.lammpstrj.dat";
...
}
但是在运行我的程序时,我收到了一条消息
不能使用字符串(“Z_90_DUMP”)作为符号引用,而在“...使用”严格引用“
我不想扫描每个输出文件的所有数据,因为dump.all.lammpstrj
太大,扫描需要很长时间。
有没有办法将定义的变量用作文件句柄?
答案 0 :(得分:5)
让您了解如何做到这一点。将文件句柄放在哈希(或者数组中,如果用数字索引)。
use strict;
use warnings;
my %fh; #file handles
open $fh{$_}, '>', "Z_${_}_dump.all.lammpstrj.dat" for 1..100; #open 100 files
for(1..10000){ #write 10000 lines in 100 files
my $random=int(1+rand(100)); #pick random file handle
print {$fh{$random}} "something $_\n";
}
close $fh{$_} for 1..100;
答案 1 :(得分:2)
在致电$filehandle
之前,不要向undef
分配任何内容或将其设置为open()
。您收到此错误是因为您已将字符串分配给$filehandle
(无论如何都没用)。
如果FILEHANDLE是未定义的标量变量(或数组或散列元素),则会自动对新文件句柄进行自动生成,这意味着为该变量分配了对新分配的匿名文件句柄的引用。否则,如果FILEHANDLE是表达式,则其值为真正的文件句柄。 (这被视为符号引用,因此
use strict "refs"
不应生效。)
要一次拥有更多文件句柄并方便地将它们映射到文件名,请考虑使用带有文件名(或任何适合您的标识符)的哈希作为存储它们的密钥。您可以检查密钥是否存在(请参阅"exists")并定义值(请参阅"defined")以避免不必要地重新打开文件。
答案 2 :(得分:0)
我真诚地感谢Kjetil S.和粘性位。我对它进行了测试,他们的建议很有效。我注意到还有另一种方法可以将数据写入不同的文件而不用改变文件处理程序。实际上我使用相同的文件处理程序更改了文件名。
....
for my $i=0;$i<=$max_number;$i++;
{
$file="$i\_foo.dat";
open DAT,'>>',"$file";
......
}