2016-04-11 4 views
2

Ich habe ein Problem mit der Aufteilung in ein Array.Perl Datei lesen und auf ein Array teilen

Ich möchte eine leere Zeile aufteilen und in einem Array speichern.

1.) Zuerst lese ich die Datei und speichere sie in einem String ($ configdata).

2.) Dann möchte ich die Zeichenfolge ($ configdata) mit der leeren Zeile teilen.

My Script:

#!/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 

Mein Merk Ergebnis:

Druck @configdata [0];

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

drucken @configdata [1];

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

drucken @configdata [2];

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

Antwort

1

Verwenden Eingabesatz separator

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

Danke für die Lösung. Es klappt. – Skydreampower

+0

@Skydreampower Wenn meine Antwort für Sie nützlich ist, klicken Sie auf das Häkchen für die akzeptierte Antwort :) – mkHun

+0

Ich bin nicht sicher, ob das wirklich als 'Verwendung' des Datensatztrennzeichens gilt, da Sie die Datei als einen einzigen Datensatz behandeln. dann spaltet es. – Sobrique

3

Das ist einfacher, als Sie denken, wenn Sie $/ verwenden - das voneinander zu trennen sind.

ZB:

#!/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 

Gibt:

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

Alternativ Sie mit map niedlich bekommen könnte ein Array von Arrays zu machen:

chomp (my @configdata = map { [split] } <DATA>); 

Welche dir geben:

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

z.

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

Hinweis - ich bin mit den Inline-__DATA__ Dateihandle zu illustrativen Zwecken. Sie würden Ihr geöffnetes Dateihandle verwenden. (chomp (my @configdata = <$configfile>);)

Auch - $/ gilt für while Schleifen, so dass jede Iteration Ihrer while wäre der Textblock sind die beabsichtigen Sie zu bedienen - so könnte man stattdessen:

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

Danke für die Lösung. Es klappt. – Skydreampower

+1

$/- wow, ich benutze seit Jahren Perl und stoße nie darauf (noch die Notwendigkeit, Dateien in Datensätze aufzuteilen) aber sehr nützlich. – thonnor

+1

'local $/=" ";' (Absatzmodus) würde viel mehr Sinn machen. – ikegami