在Perl中,如何将文件内容读入数组?

时间:2012-04-30 10:54:59

标签: perl

  

可能重复:
  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

3 个答案:

答案 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;