Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]8651[/thread]

Datei auslesen und best. pattern in hash speichern (Seite 2)



<< |< 1 2 >| >> 17 Einträge, 2 Seiten
Duff
 2007-01-18 13:09
#73292 #73292
User since
2006-10-06
283 Artikel
BenutzerIn

user image
[quote=renee,18.01.2007, 11:41][/quote]
Erstmal Danke für die gute Erklärung. Jetzt wird mir auch mal endlich klar, wie das mit dem Speichern funktioniert bzw. woher perl weiß, was zusammen gehört.

Quote
Du musst doch schon vorher wissen, welche Pattern du hast, oder? Wenn nicht, dann musst Du hier mal deutlicher darlegen, welche Informationen Du hast...


Ja ich weiß schon, welche Pattern ich vorher verwende, doch es könnte sich theoretisch der Wert verändern, so dass ich die Werte nicht fest vorgeben will, sondern anhand der Pattern in einem Array speichere.

Der Hash wird nun auch korrekt angelegt, wobei bei einem Schlüssel die Werte neben den gültigen auch undef beinhalten.

Ist es nun auch möglich aus diesem Hash bestimmte Schlüssel mit Werten zu bekommen, wenn man in einem anderen Array nur einen Teil von den Werten aus dem Hash gespeichert hat?

Beispiel:
Hash:
Code: (dl )
1
2
hash{test001}=[NAME11, NAM13]
hash{test002}=[Name12]


Array:
[CODE]
@array=qw(NAME13, NAME14, NAME15);
[/CODE

Als Ergebnis soll dann so was rauskommen (nur die Übereinstimmungen):
hash{test001}=[NAME11, NAM13]

oder

In $test001 ist NAME13 true und NAME11 false
D'OH
Daniel
renee
 2007-01-18 13:14
#73293 #73293
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

my %hash;
$hash{test001}=['NAME11', 'NAM13'];
$hash{test002}=['Name12'];

my @array = qw(NAME13 NAME14 NAME15);

for my $key(keys %hash){
if(grep{my $i = $_; defined $i and grep{$_ eq $i}@array}@{$hash{$key}}){
print Dumper($hash{$key});
}
}


Edit: ein paar kleinere Fehler beseitigt...\n\n

<!--EDIT|renee|1169124654-->
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Duff
 2007-01-18 14:30
#73294 #73294
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Danke.
Ich bekomme immer noch folgende Fehlermeldung:
Code: (dl )
Use of uninitialized value in string eq at skript.pl.


Das Ergebnis wollte ich dann in etwa so speichern:
Code: (dl )
push(@result, @{$hash{$key}});


Bei der Ausgabe von @result wäre es nur nicht schlecht, wenn alle geleichen Strings (vom Namen her) nur einmal ausgegeben werden und nicht öfter.
D'OH
Daniel
renee
 2007-01-18 14:51
#73295 #73295
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ich habe in meinem Code ein paar Fehler beseitigt. Bitte nochmal testen.

Und bitte etwas genauer beschrieben, was Du im Endeffekt haben willst.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Duff
 2007-01-19 09:09
#73296 #73296
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Danke.

Also ich bekomme nun als Ergebnis folgendes raus:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$VAR1 = [
'NAME11',
'NAME11',
'NAME13',
'NAME13'
];
$VAR1 = [
undef,
undef,
undef,
'NAME12',
'NAME12',
'NAME12',
'NAME13',
'NAME13',
'NAME13'
];


Ich hätte nun gerne die Werte nur einmal, also nicht doppelt in der Ausgabe. Vielleicht ist es auch besser, wenn ich mir nun alle Werte noch mal in einem eigenen Array speichere?
D'OH
Daniel
GoodFella
 2007-01-19 11:31
#73297 #73297
User since
2007-01-09
192 Artikel
BenutzerIn
[default_avatar]
Wie würdest du es denn machen?
Mir würden da gleich 2 Methoden einfallen: 1. in nem Hash speichern, 2. Iterierend in eine Ausgabeliste pushen und vor jedem push über die Liste iterieren, ob schon vorhanden; wobei ich 1. wählen würde, da perfomanter.
Duff
 2007-01-19 14:59
#73298 #73298
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Ok, danke.

Ich habe mich für die erste Methode entschieden.

Code: (dl )
1
2
3
4
5
6
7
8
9
my %seen = ();
my @uniq;
foreach my $array (@result) {
foreach my $item (@{$array}) {
push(@uniq, $item) unless $seen{$item}++;
}
}
@uniq = sort keys %seen;
print "@uniq\n";
D'OH
Daniel
<< |< 1 2 >| >> 17 Einträge, 2 Seiten



View all threads created 2007-01-16 19:43.