可能重复:
Easiest way to open a text file and read it into an array with Perl
我是Perl的新手,并希望每个文件在一个单独的数组中推送该文件的内容,我设法通过以下方式执行此操作,该文件使用if语句。但是,对于我的阵列,我想要1美元。那可能吗?
#!/usr/bin/perl
use strict;
my @karray;
my @sarray;
my @testarr = (@sarray,@karray);
my $stemplate = "foo.txt";
my $ktemplate = "bar.txt";
sub pushf2a {
open(IN, "<$_[0]") || die;
while (<IN>) {
if ($_[0] eq $stemplate) {
push (@sarray,$_);
} else {
push (@karray,$_);
}
}
close(IN) || die $!;
}
&pushf2a($stemplate,@sarray);
&pushf2a($ktemplate,@karray);
print sort @sarray;
print sort @karray;
我想要这样的事情:
#!/bin/sh
myfoo=(@s,@k)
barf() {
pushtoarray $1
}
barf @s
barf @k
答案 0 :(得分:6)
如果要打锉文件,请使用File::Slurp:
use File::Slurp;
my @lines = read_file 'filename';
答案 1 :(得分:4)
首先,你不能在Perl中调用数组$1
,因为正则表达式引擎会使用它(以及所有其他带有数字作为名称的标量),因此只要正则表达式匹配就会被覆盖跑了。
其次,您可以更轻松地将文件读入数组:只需在列表上下文中使用菱形运算符。
open my $file, '<', $filename or die $!;
my @array = <$file>;
close $file;
然后你得到一个文件行的数组,由当前行分隔符拆分,默认情况下你可能期望它是你平台的换行符。
第三,你的pushf2a
sub很奇怪,特别是传入数组然后不使用它。你可以写一个子程序,它接受一个文件名并返回一个数组,从而避免你的内部if语句的问题:
sub f2a {
open my $file, '<', $_[0] or die $!;
<$file>;
# $file closes here as it goes out of scope
}
my @sarray = f2a($stemplate);
my @karray = f2a($ktemplate);
总的来说,我不确定最佳解决方案是什么,因为我无法确切地知道你想做什么,但也许这会帮助你。
答案 2 :(得分:0)
不明白,对于数组你想要$1
,但这个代码是好的做法:
我在HoA中包含文件及其内容 - 数组哈希
my $main_file = qq(container.txt); #contains all names of your files.
my $fh; #filehandler of main file
open $fh, "<", $main_file or die "something wrong with your main file! check it!\n";
my %hash; # this hash for containing all files
while(<$fh>){
my $tmp_fh; # will use it for files in main file
#$_ contain next name of file you want to push into array
open $tmp_fh, "<", $_ or next; #next? maybe die, don't bother about it
$hash{$_}=[<$tmp_fh>];
#close $tmp_fh; #it will close automatically
}
close $fh;