0

重複の可能性:
テキスト ファイルを開いて Perl で配列に読み込む最も簡単な方法

私はPerlを初めて使用し、ファイルごとにそのファイルの内容を1つの個別の配列にプッシュしたいのですが、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

ファイルを丸呑みする場合は、File::Slurpを使用します:

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

まず、Perl で配列を呼び出すことはできません。配列$1(および名前に数字が含まれる他のすべてのスカラー) は正規表現エンジンによって使用され、正規表現の一致が実行されるたびに上書きされる可能性があるためです。

次に、それよりもはるかに簡単にファイルを配列に読み込むことができます。リスト コンテキストでダイヤモンド演算子を使用するだけです。

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

次に、ファイルの行の配列を取得します。これは、現在の行区切り記号で分割されます。これは、デフォルトでは、プラットフォームの改行であると予想されるものです。

第三に、あなたのpushf2aサブはかなり奇妙で、特に配列を渡してからそれを使用していません。ファイル名を受け取り、配列を返すサブルーチンを作成して、内部 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 に答える