2016-04-11 6 views
0

Ich habe ein Problem über die Foreach-Schleife und Splitting mit Perl.Perl und Foreach Schleife mit Teilen

Ich möchte die Arrays Schleife und auf Name und Wert teilen.

1.) Ich lese die Datei und speichern sie in einem String.

2.) Ich spalte die leere Zeile und speichere sie in einem Array.

My Script:

#!/usr/bin/perl 

use strict; 

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

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

local $/; 
my @configdata = split("\n\n",<$configfile>); 

#print $configdata[0], "\n"; 
#print $configdata[1], "\n"; 
#print $configdata[2], "\n"; 

foreach my $data (@configdata){ 
     my @editing = split /#/, $data; 
     my ($name, $value) = @editing[0,1]; 
     print $name "\n"; 
     print $value "\n"; 
} 

close $configfile; 

Configfile:

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

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

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

Mein Wunsch Ergebnis:

$ name = Testingtttttttttttttttttttttttt

$ Value = 0987654345678909876MN09uz6t56789oiuhgölkjhgfr 0987654323456789098765fgnloiuztlkjhgfrtzuiknb

$ name = MegaMixoiuzt

$ value = 09876543457890098765NSUDlkjhzgtfr67899ztz9098 098765435678987t8765678987656789876567909765

$ name = TESTINGPARTS

$ value = 0987654567890098765hzzasza654567uhgdjdjfacdaa 9876545678987654mchfuiaq754567898765434567876

+1

Ich sehe keinen Grund, nicht eine dieser Antworten zu akzeptieren, jedes davon löst Ihr Problem – red0ct

Antwort

3
split /#/   # A "#" separates the two. 

sollte

split /\n#+\n/  # A line of "#" separates the two. 

Mit anderen Verbesserungen sein:

#!/usr/bin/perl 

use strict; 
use warnings; 

my $config_qfn = 'config.conf'; 

open(my $config_fh, "<", $config_qfn) 
    or die("Can't open \"$config_qfn\": $!\n"); 

local $/ = ""; # Paragraph mode 
while (my $rec = <$config_fh>) { 
    my ($name, $value) = split(/\n#+\n/, $rec); 
    print "\$name = $name\n"; 
    print "\$value = $value\n"; 
} 
+0

vielleicht '$ data' sollte nicht da sein – red0ct

+0

In der Tat. Fixed .. – ikegami

1

Sie wollen # durch mehrere aufzuspalten so #+

+ Spiel ein oder mehrere Male verwendet werden.

Probieren Sie es

#/usr/bin/perl

use strict; 

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

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

local $/; 
my @configdata = split("\n\n",<$configfile>); 


foreach my $data (@configdata){ 
    my ($name,$value) = split /\n#+\n/, $data; 
    print "$name $value\n\n"; 
} 
+0

@ikegami Vielen Dank für Ihren Gebrauch voller Kommentar. Ich entferne die nachlaufende und führende neue Zeile durch Teilen. Und dann habe ich den '@ Wert' auf '$ Wert' geändert. :) – mkHun

2

auch so etwas wie dies ohne foreach:

use strict; 
use warnings; 

open my $fh, '<config.conf' or die "$!"; my $data = join '', <$fh>; close $fh; 
my %hash = $data =~ /^(.+)\n#+\n(\S+\n\S+)/mg; 
print "NAME: $_\nVALUE: $hash{$_}\n\n" for keys %hash 
+0

Hinweis: Dies setzt voraus, dass der Wert keine Leerzeichen enthält. Außerdem wird davon ausgegangen, dass der Name genau eine Zeile lang ist und dass der Wert immer genau zwei Zeilen lang ist. – ikegami

+0

Vielen Dank!Wird '$ _ = ~ s/\ n // bei Schlüsseln% hash' helfen, wenn nötig? Oder ich kann dich nicht verstehen? – red0ct

+0

Ich sage nicht, dass es ein Problem gibt. Ich liste nur die Annahmen auf, die Sie getroffen haben. Sie könnten vollkommen gute Annahmen sein. Es liegt am OP zu entscheiden. (Das heißt, ich glaube nicht, dass der Wert immer zwei Zeilen lang ist.) Diese Zeile beeinflusst nicht die Annahmen, die ich aufgelistet habe. – ikegami