2016-04-11 11 views
2

配列への分割に関する問題があります。Perlファイルの読み込みと配列への分割

空の行を分割して配列に保存したいとします。

1.)まず、ファイルを読み込んで文字列($ configdata)に保存します。

2.)次に、String($ configdata)を空の行で分割します。

マイスクリプト:

#!/usr/bin/perl 

use strict; 

my $pathconfigfile = 'config.conf'; 
my @configline; 

open(my $configfile, "<", $pathconfigfile); 

     while(<$configfile>){ 


       my $configdata = $_; 


       my @configdata = split /\n\n/, $configdata; 
       print @configdata[0] "\n"; 
       print @configdata[1] "\n"; 
       print @configdata[2] "\n"; 

     } 
close $configfile; 

CONFIGFILE:

Testingtttttttttttttttttttttttt 
############################################ 
0987654345678909876MN09uz6t56789oiuhgölkjhgfr 
0987654323456789098765fgnloiuztlkjhgfrtzuiknb 

MegaMixoiuzt 
############################################ 
09876543457890098765NSUDlkjhzgtfr67899ztz9098 
098765435678987t87656789876567898765679097658 

TESTINGPARTS 
############################################ 
0987654567890098765hzzasza654567uhgdjdjfacdaa 
9876545678987654mchfuiaq754567898765434567876 

マイウィッシュ結果:

印刷@configdata [0];

Testingtttttttttttttttttttttttt 
############################################ 
0987654345678909876MN09uz6t56789oiuhgölkjhgfr 
0987654323456789098765fgnloiuztlkjhgfrtzuiknb 

print @configdata [1];

MegaMixoiuzt 
############################################ 
09876543457890098765NSUDlkjhzgtfr67899ztz9098 
098765435678987t87656789876567898765679097658 

print @configdata [2];

答えて

1

使用入力の記録セパレータ

open(my $configfile, "<", $pathconfigfile) or die "$!"; 
local $/; 
my @configdata = split("\n\n",<$configfile>); 
print @configdata; 
+0

ありがとうございました。できます。 – Skydreampower

+0

@Skydreampower私の答えがあなたのために有用である場合、受け入れられた答えのためにチェックボタンをクリックしてください:) – mkHun

+0

私はそれが本当に1つのレコードとしてファイルを扱っているので、それを分割します。 – Sobrique

3

$/ - レコードセパレータを使用すると、これは思ったよりも簡単です。

例:

#!/usr/bin/env perl 
use strict; 
use warnings; 

use Data::Dumper; 

local $/ = "\n\n"; 
#chomp removes $/ from the field) 
chomp (my @configdata = <DATA>); 

print Dumper \@configdata 


__DATA__ 
Testingtttttttttttttttttttttttt 
############################################ 
0987654345678909876MN09uz6t56789oiuhgölkjhgfr 
0987654323456789098765fgnloiuztlkjhgfrtzuiknb 

MegaMixoiuzt 
############################################ 
09876543457890098765NSUDlkjhzgtfr67899ztz9098 
098765435678987t87656789876567898765679097658 

TESTINGPARTS 
############################################ 
0987654567890098765hzzasza654567uhgdjdjfacdaa 
9876545678987654mchfuiaq754567898765434567876 

を与える:

また
$VAR1 = [ 
      'Testingtttttttttttttttttttttttt 
############################################ 
0987654345678909876MN09uz6t56789oiuhgölkjhgfr 
0987654323456789098765fgnloiuztlkjhgfrtzuiknb', 
      'MegaMixoiuzt 
############################################ 
09876543457890098765NSUDlkjhzgtfr67899ztz9098 
098765435678987t87656789876567898765679097658', 
      'TESTINGPARTS 
############################################ 
0987654567890098765hzzasza654567uhgdjdjfacdaa 
9876545678987654mchfuiaq754567898765434567876' 
     ]; 

を、あなたは、配列の配列を作るためにmapでかわいい得ることができる:

あなたを与えるだろう
chomp (my @configdata = map { [split] } <DATA>); 

$VAR1 = [ 
      [ 
      'Testingtttttttttttttttttttttttt', 
      '############################################', 
      '0987654345678909876MN09uz6t56789oiuhgölkjhgfr', 
      '0987654323456789098765fgnloiuztlkjhgfrtzuiknb' 
      ], 
      [ 
      'MegaMixoiuzt', 
      '############################################', 
      '09876543457890098765NSUDlkjhzgtfr67899ztz9098', 
      '098765435678987t87656789876567898765679097658' 
      ], 
      [ 
      'TESTINGPARTS', 
      '############################################', 
      '0987654567890098765hzzasza654567uhgdjdjfacdaa', 
      '9876545678987654mchfuiaq754567898765434567876' 
      ] 
     ]; 

など。

$configdata[0][0] = 'Testingtttttttttttttttttttttttt' 

注 - 私は、例示の目的のためにインライン__DATA__ファイルハンドルを使用しています。開いているファイルハンドルを使用します。また、(chomp (my @configdata = <$configfile>);

から$/whileループに適用されますので、あなたのwhileの各反復は、あなたが上で動作することを意図しているテキストのチャンクだろう - そう、あなたが代わりにできます。

while (<DATA>) { 
    chomp; 
    print "Start of chunk:\n"; 
    print; 
    print "\nEnd of chunk\n"; 
} 
+0

ありがとうございました。できます。 – Skydreampower

+1

$/- うわー、私は何年も前からPerlを使ってきましたが、これは(ファイルをレコードに分割する必要はありませんが)非常に便利です。 – thonnor

+1

'local $/=" ";'(段落モード)ははるかに意味があります。 – ikegami

関連する問題