Perl: File in Hash

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Perl: File in Hash

Beitrag von linuxCowboy » 27.01.2014 22:02:04

Was habt ihr fuer eine Loesung, wenn eine Zeile mehr als ein Key/Value-Paar enthaelt?

Code: Alles auswählen

$ cat f
11k 11v 12k 12v
21k 21v 22k 22v

$ perl -anE'$i=0;while($F[$i+1]){$h{$F[$i]}=$F[$i+1];$i+=2};END{for(sort keys %h){say "$_ => $h{$_}"}}' f
11k => 11v
12k => 12v
21k => 21v
22k => 22v
-der_linux_cowboy --- Besser werden! ... f*** w$$

linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Re: Perl: File in Hash

Beitrag von linuxCowboy » 27.01.2014 23:08:54

Noch fetter wird's wenn man dass, was Perl einem auf der cmdline freundlicherweise abnimmt, selbst implementieren muss:

Code: Alles auswählen

#!/usr/bin/perl -w
#
use 5.010;

%h = ();
while (<>) {
	@a = split;
	$i=0;
	while ($a[$i + 1]) {
		$h{$a[$i]} = $a[$i + 1];
		$i += 2;
	}
}

for (sort keys %h) {
	say "$_ => $h{$_}";
}
-der_linux_cowboy --- Besser werden! ... f*** w$$

Benutzeravatar
goeb
Beiträge: 348
Registriert: 26.08.2006 18:12:08
Lizenz eigener Beiträge: MIT Lizenz

Re: Perl: File in Hash

Beitrag von goeb » 28.01.2014 11:17:50

Kannst dir natürlich auch einfach die Hälfte sparen:

Code: Alles auswählen

#!perl -w

use strict;
use feature 'say';

my @a;
push @a, split while (<>);

my %h = @a;

for (sort keys %h) {
   say "$_ => $h{$_}";
}
Edit: Müll entfernt :) Falls Zeilen mit ungerader Anzahl an Elementen vorkommen (damit wird der letzte Wert der Zeile ein leerer String):

Code: Alles auswählen

while (<>) {
  push @a, split;
  push @a, '' if @a % 2;
}

linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Re: Perl: File in Hash

Beitrag von linuxCowboy » 28.01.2014 14:22:55

%h = @a ist es!! Genial einfach. So einfach, da muss man erstmal draufkommen! ;-)

goeb hat wieder die entscheidende Idee.
:hail:

der solide 4-zeiler:

Code: Alles auswählen

while (<>) {
	push @a, split;
	push @a, '' if @a % 2;
}
%h = @a;
der schlanke 2-zeiler:

Code: Alles auswählen

push @a, split while <>;
%h = @a unless @a % 2; # no risk, no fun!
der nicht funktionale einzeiler:

Code: Alles auswählen

push @a, split while <> and %h = @a;
Zuletzt geändert von linuxCowboy am 29.01.2014 00:06:59, insgesamt 1-mal geändert.
-der_linux_cowboy --- Besser werden! ... f*** w$$

linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Re: Perl: File in Hash

Beitrag von linuxCowboy » 28.01.2014 18:13:43

goeb hat geschrieben:

Code: Alles auswählen

#!perl -w

use strict;
use feature 'say';
#!perl funktioniert leider nicht. (hast du sicher nur symbolisch gemeint)

Für einen kurzen hack nehme ich die cmdline und brauche es nicht. Wenns länger wird oder unübersichtlich stecke ich alles in ein File.
:?:
Ich will trotzdem nicht jedesmal:
  • '#!/usr/bin/perl -w' eingeben
  • 'use 5.14.2;' eingeben
  • 'chmod +x file' ausführen
:!:
Lösung:

Code: Alles auswählen

export PERL5OPT='w M5.14.2' # .bash_aliases
perl file.pl
Wenn das tempfile die Endung .pl hat gibt's im vim trotzdem Syntaxhighlighting. :wink:
Zuletzt geändert von linuxCowboy am 29.01.2014 11:16:48, insgesamt 1-mal geändert.
-der_linux_cowboy --- Besser werden! ... f*** w$$

Benutzeravatar
goeb
Beiträge: 348
Registriert: 26.08.2006 18:12:08
Lizenz eigener Beiträge: MIT Lizenz

Re: Perl: File in Hash

Beitrag von goeb » 28.01.2014 20:24:07

linuxCowboy hat geschrieben:#!perl funktioniert leider nicht. (hast du sicher nur symbolisch gemeint)
Hatte es auf einer mit noexec gemounteten Partition getestet, also mit perl scriptname, dann nur für das Forum schnell noch eingefügt.

Off Topic: Ansonsten verwende ich lieber #!/usr/bin/env perl, das berücksichtigt gleich noch eventuelle lokale Installationen die im $PATH vor /usr/bin/perl kommen. Dann muß allerdings das -w weg und ein use warnings; drunter.

Und wenn es länger wird kann man ruhig die paar Zeichen mehr schreiben und hat dafür ein portables Skript…

Antworten