Thread Perl - trennen nach Leerer Zeile (6 answers)
Opened by savedxd at 2017-06-21 21:28

Linuxer
 2017-06-22 00:14
#186709 #186709
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
Wenn das in einer Variable vorliegen hast, kannst Du natürlich split() verwenden, um an der Leerzeile zu splitten und dann jeden Datensatz einzeln verarbeiten.

Code (perl): (dl )
my @datasets = split m{\n\n}, $datenwust;


Oder man nutzt Perl-Magie und lässt Perl das machen, indem man den $INPUT_RECORD_SEPARATOR entsprechend einstellt. Siehe Perldoc:perlvar

Beispiel mit Perl-Magie und split(); am Ende hat man einen Hash-of-Hash:

more (10.5kb):

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#! /usr/bin/perl
use strict;
use warnings;
use 5.010;

use Data::Dumper;

my %data;

sub process_dataset {
    my ( $dataset ) = @_;
    my $name;
    my %attr;

    # split dataset into lines
    for my $line ( split m{\n}, $dataset ) {

        if ( my ( $k, $v ) = $line =~ m/^(.+?)\s*=\s*(.+?)$/ ) {
            $attr{$k} = $v;
        }
        # no assignment found; must be a name
        else {
            $name = $line;
        }

    }

    return $name, \%attr;
}

# read by dataset, localize $/ in block
{
    local $/ = "\n\n";

    while ( my $dataset = <DATA> ) {

        # remove $/ from dataset
        chomp $dataset;

        my ( $name, $attr ) = process_dataset( $dataset );        
        
        $data{$name} = $attr        if $name;
    }
}

say Dumper \%data;

__DATA__
h
cool = ja
schön = nein

d
cool = nein
schön = ja

b
cool = nein
schön = nein

Resultat:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$VAR1 = {
'b' => {
'schön' => 'nein',
'cool' => 'nein'
},
'd' => {
'schön' => 'ja',
'cool' => 'nein'
},
'h' => {
'schön' => 'nein',
'cool' => 'ja'
}
};


Last edited: 2017-06-22 00:16:29 +0200 (CEST)
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!

View full thread Perl - trennen nach Leerer Zeile