0

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

3 回答 3

6

如果您要 slurp 文件,请使用File::Slurp

use File::Slurp;
my @lines = read_file 'filename';
于 2012-04-30T11:15:40.027 回答
4

首先,您不能$1在 Perl 中调用数组,因为它(以及所有其他以数字作为名称的标量)被正则表达式引擎使用,因此无论何时运行正则表达式匹配都可能被覆盖。

其次,您可以比这更容易将文件读入数组:只需在列表上下文中使用菱形运算符。

open my $file, '<', $filename or die $!;
my @array = <$file>;
close $file;

然后,您将获得文件行的数组,由当前行分隔符分割,默认情况下,您可能期望它是您平台的换行符。

第三,你的pushf2asub 很奇怪,特别是传入一个数组然后不使用它。您可以编写一个接受文件名并返回数组的子例程,从而避免内部 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);

总的来说,我不确定最好的解决方案到底是什么,因为我不能完全弄清楚你想要做什么,但也许这会对你有所帮助。

于 2012-04-30T11:06:18.517 回答
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;
于 2012-04-30T11:10:05.773 回答