Schrift
[thread]7944[/thread]

Hashkey nach Spalten sortiert ausgeben (Seite 2)



<< |< 1 2 >| >> 16 Einträge, 2 Seiten
Ronnie
 2006-05-06 12:25
#65598 #65598
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
So, noch etwas mehr verdeutlicht und auf deinen Bedarf angepasst:
Code: (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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;

package SingleState;
use Moose;

has 'state' => (isa => 'Value', is => 'rw');
has 'value' => (isa => 'Value', is => 'rw');
has 'position' => (is => 'rw');

sub to_s {
my $self = shift;
return $self->state . "\t=>\t" . $self->value . "\n";
}

package Stat;
use Moose;

has 'states' => (isa => 'ArrayRef', is => 'rw');
has 'title' => (is => 'rw');
has 'position' => (is => 'rw');

sub add_state {
my $self = shift;
return unless @_;
push @{$self->{states}}, $_ for @_;
}

sub to_s {
my $self = shift;
my $o = $self->title ? "== " . $self->title . " ==\n" : '';
$o .= $_->to_s for (sort { $a->position <=> $b->position } @{$self->states});
return $o;
}

package StatSet;
use Moose;
use Data::Dumper;

has 'stats' => (isa => 'ArrayRef', is => 'rw');

sub add_stat {
my $self = shift;
return unless @_;
push @{$self->{stats}}, $_ for @_;
}

sub report {
my $self = shift;
my $s;
$s .= $_->to_s . "\n" for (sort { $a->position <=> $b->position } @{$self->stats});
return $s;
}

package main;

my $set = new StatSet;

my $stat1 = new Stat ( title => 'CPU' );
my $stat2 = new Stat ( title => 'Memory' );

my $state1 = new SingleState( state => 'Idle', value => '92', position => 1 );
my $state2 = new SingleState( state => 'User', value => '0', position => 2 );
my $state3 = new SingleState( state => 'Cached', value => '531976', position => 1 );


$stat1->add_state( $state1, $state2 );
$stat1->position(1);

$stat2->add_state( $state3 );
$stat2->position(2);

$set->add_stat($stat1);
$set->add_stat($stat2);

print $set->report;

Ausgabe beispielhaft:
Code: (dl )
1
2
3
4
5
6
== CPU ==
Idle => 92
User => 0

== Memory ==
Cached => 531976
shaihulud
 2006-05-10 18:49
#65599 #65599
User since
2006-04-12
76 Artikel
BenutzerIn
[default_avatar]
krieg mal wieder die krise mit den ausgaben:

Code: (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
open(DATEI, "<./Konfigurationsdaten/20060310.DOCFIELD") || die "Datei nicht gefunden";
my @Zeilen = <DATEI>;
close(DATEI);
my %hash2;
my $old_doc = "x";

 foreach (@Zeilen){
     if (/(\w+)\;(\d+)\;(\d+)/){
       $dokuart =  $1;
       $zahl1 =  $2;
       $zahl2 =  $3;
       if($dokuart!=$old_doc){
       $hash2{$old_doc}=$hash; <-------- initialisierende zeile
       my %hash;
       }
       open(DATEI, "<./Konfigurationsdaten/20060310.REPOSITORY") || die "Datei nicht gefunden";
       my @Zeilen2 = <DATEI>;
       close(DATEI);
       foreach(@Zeilen2){
         if(/^$zahl2;([^;]+)/){
           $hash{$zahl}=$1;                                
         }
       }
       
     }
     $old_doc = $dokuart;
 }
 
 foreach my $ele (%hash2){
   foreach my $ele2 (keys %{$ele}){
   print "$ele2\n";
   }
 }


wieso gibt er mir nichts aus?
ich möchte doch nur alle information die in %hash2 drin stehn.
er gibt mir nichtmal die $dokuart aus... (s.o.)\n\n

<!--EDIT|shaihulud|1147272644-->
bloonix
 2006-05-11 10:46
#65600 #65600
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
hää??

hast du dich irgendwie im Thread verirrt? :)

in deinem Codebeispiel sind ziemlich heftige Mängel!

manches kann man auch um einiges besser machen...

Code: (dl )
open(DATEI, "<./Konfigurationsdaten/20060310.DOCFIELD") || die "Datei nicht gefunden";


Das ist ein bisschen mager, findest du nicht? Schreibe lieber
sowas wie "Fehler beim öffnen von Datei $datei - $!", denn
vielleicht gibt es die Datei, nur der Prozess hat keine Leserechte...

Code: (dl )
my @Zeilen = <DATEI>;


Das könnte ich verstehen, wenn du den Inhalt irgendwann
nochmal gebrauchen könntest, aber in deinem Codesegment
ist nichts davon zu sehen. Dann durchlaufe die Datei doch
ganz simple mit while (my $zeile = <DATEI>) {}

Code: (dl )
my $old_doc = "x";


my $old_doc; reicht eigentlich.

Code: (dl )
1
2
3
4
      if (/(\w+)\;(\d+)\;(\d+)/){
       $dokuart =  $1;
       $zahl1 =  $2;
       $zahl2 =  $3;


Wenn du nur die ersten drei "Spalten" benötigst, dann geht
es auch so my ($dokuart,$zahl1,$zahl2) = (split /;/,$zeile)[0..2];

Code: (dl )
if(/^$zahl2;([^;]+)/){


Nicht schlecht...

Quote
Code: (dl )
foreach my $ele (%hash2){


wieso gibt er mir nichts aus?


na denk mal ganz scharf nach... wie durchläuft man einen Hash? =)

Für mehr hab ich grad keine Zeit, aber du bist damit eh' im
falschen Thread. Ohne dir damit auf die Füße treten zu wollen,
aber mir wäre es lieb, wenn man die beiden Antworten in den
original Thread verschieben könnte, wenn das geht.

Einen lieben Gruß an die Moderatoren hier :-)

opi\n\n

<!--EDIT|opi|1147330681-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
shaihulud
 2006-05-11 15:24
#65601 #65601
User since
2006-04-12
76 Artikel
BenutzerIn
[default_avatar]
[quote=opi,11.05.2006, 08:46]
Code: (dl )
1
2
3
4
      if (/(\w+)\;(\d+)\;(\d+)/){
       $dokuart =  $1;
       $zahl1 =  $2;
       $zahl2 =  $3;


Wenn du nur die ersten drei "Spalten" benötigst, dann geht
es auch so my ($dokuart,$zahl1,$zahl2) = (split /;/,$zeile)[0..2];[/quote]
sry hast recht. bin tatsächlich im falschen thread gelandet..

wieso ist diese Lösung besser als meine?Effizienter? wenn ja warum? die zeile wird doch gleich abgelaufen.. spart split mehr als wenn ich ne abfrage mache?

Code: (dl )
1
2
        my ($dokuart,$zahl1,$zahl2) = (split /;/,$zeile)[0..2];
print $dokuart;

habs grad ausprobiert und in dokuart steht mit deinem Lösungsvorschlag nichts drin...\n\n

<!--EDIT|shaihulud|1147347160-->
bloonix
 2006-05-11 15:38
#65602 #65602
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=shaihulud,11.05.2006, 13:24][quote=opi,11.05.2006, 08:46]
Code: (dl )
1
2
3
4
      if (/(\w+)\;(\d+)\;(\d+)/){
       $dokuart =  $1;
       $zahl1 =  $2;
       $zahl2 =  $3;


Wenn du nur die ersten drei "Spalten" benötigst, dann geht
es auch so my ($dokuart,$zahl1,$zahl2) = (split /;/,$zeile)[0..2];[/quote]

wieso ist diese Lösung besser als meine?Effizienter? wenn ja warum? die zeile wird doch gleich abgelaufen.. spart split mehr als wenn ich ne abfrage mache?[/quote]
nein du hast recht... ich habe irgendwie deine if-abfrage
missachtet... denn immerhin willst du die zeile nur bearbeiten,
wenn dein match erfolgreich ist... ok
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
Strat
 2006-05-11 17:04
#65603 #65603
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
bei
Code: (dl )
my ($dokuart,$zahl1,$zahl2) = ( split(/;/,$zeile) )[0..2];

muss vermutlich die gesammte $zeile aufgesplittet werden, und dann nur die ersten drei elemente zurueckgegeben werden.

ich wuerde auf den arrayslice verzichten und direkt
Code: (dl )
my( $dokuart, $zahl1, $zahl2 ) = split( /;/, $zeile );

schreiben; split hat naemlich einen 3. parameter, der, wenn er nicht angegeben ist, eine spalte mehr splittet als vorne ergebnisvariablen stehen, womit mein loesungsansatz mindestens gleich schnell sein muesste, und zusaetzlich besser lesbar
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< |< 1 2 >| >> 16 Einträge, 2 Seiten



View all threads created 2006-05-05 17:58.