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

fortlaufende Nummer in Variablenname

Leser: 1


<< |< 1 2 >| >> 16 Einträge, 2 Seiten
EagleFox
 2007-01-15 15:15
#73225 #73225
User since
2006-04-10
66 Artikel
BenutzerIn
[default_avatar]
Hallo Leute,

ich hoffe ich werde nicht von der Welt gebombt nach der folgenden Frage:

Ist es möglich z.B. in einer Schleife einen Variablennamen zu verwenden wie z.B. $name$i oder für ein array @name$i?

Hintergrund: Ich möchte aus mehrere Dateien Daten auslesen und in verschiedene arrays packen. Nehmen wir an die Dateien heissen d1, d2, d3, ... Dann würde ich gerne jeweils mehrere Spalten einer Datei auslesen und in arrays packen wie z.B. @Spalte1_d1, @Spalte2_d1, @Spalte3_d1 ... @Spalte1_d3, @Spalte2_d3, @Spalte3_d3...

Kann man es irgendwie bewerkstelligen das ganze dynamisch zu machen im Sinne einer Schleife mit z.B. @Spalte1_$i?

Ich hoffe es gibt da einen Trick. Danke schon mal im voraus.
renee
 2007-01-15 15:21
#73226 #73226
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ich würde Dir raten, das in einem HashOfArrays zu machen... Dann kannst Du die fortlaufende Zahl als Schlüssel nehmen...

grobes Beispiel:
Code: (dl )
1
2
3
4
5
for(0..10){
open my $fh,'<',$file or die $!;
$hash{$_} = [<$fh>];
close $fh;
}
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/
pq
 2007-01-15 15:22
#73227 #73227
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
es geht, aber für sowas sind arrays bzw. hashes gedacht.
da du eh nur ärger mit symbolischen referenzen bekommen wirst, lass es lieber bleiben.
statt @spalte1_d1 => $Spalte[1]->[1]
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
EagleFox
 2007-01-15 15:35
#73228 #73228
User since
2006-04-10
66 Artikel
BenutzerIn
[default_avatar]
Puh, das ging ja fix mit der Antwort. Danke!

Ich habe befürchtet, dass ich auf hashes verwiesen werde. Ganz so weit blicke ich da nur noch nicht so durch. Was genau passiert durch den Code von renee? Die ersten 11 Spalten einer Datei namens $file werden jeweils in $hash{0} bis $hash{10} gepackt?
renee
 2007-01-15 15:46
#73229 #73229
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ich habe nur ein ganz kurzes Beispiel genommen, um zu zeigen, wie es prinzipiell funktioniert...
Mein Code speichert für jeden Wert von 0 bis 10 die Zeilen der Datei in einer Arrayreferenz.

Wenn Du ein Array mit drei Dateien hast, dann könnte man es ungefähr so machen:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/perl

use strict;
use warnings;
# für die Ausgabe des Hashes
use Data::Dumper;

# die Dateien
my @files = qw(file1.txt file2.txt file3.txt);

# hier wird alles drin gespeichert
my %hash;

for(0..(scalar @files)-1){
open my $fh,'<',$files[$_] or die $!;
$hash{$_} = [<$fh>];
close $fh;
}

print Dumper(\%hash);
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/
EagleFox
 2007-01-15 16:24
#73230 #73230
User since
2006-04-10
66 Artikel
BenutzerIn
[default_avatar]
ok, Code verstanden. Ich habe also z.B. im hash $hash{0} den kompletten Inhalt der ersten Datei.
Zwei kurze Fragen:
Wie greife ich z.B. auf den 3. Wert der 2. Spalte der ursprünglich 3. Datei zu?
Kann ich dem hash auch nur die ersten drei Spalten zuweisen indem ich z.B. folgenden Code nutze
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
for(0..(scalar @files)-1){
open my $fh,'<',$files[$_] or die $!;
while(do {local $/="\n\n\n";defined($data = <"$fh">)}){
for my $line(split(/\r?\n/,$data)){
chomp $line;
my $spalte1 = (split(/\s+/,$line))[0];
my $spalte2 = (split(/\s+/,$line))[1];
my $spalte3 = (split(/\s+/,$line))[2];
$hash{$_} = ($spalte1, $spalte2, $spalte3);
}
}
}
renee
 2007-01-15 16:40
#73231 #73231
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Der Code ist leicht fehlerhaft. Änder den mal so um:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
for my $index(0..(scalar @files)-1){
open my $fh,'<',$files[$_] or die $!;
my $data_counter = 0;
while(do {local $/="\n\n\n";defined($data = <$fh>)}){
my $line_counter = 0;;
for my $line(split(/\r?\n/,$data)){
chomp $line;
my ($spalte1,$spalte2,$spalte3) = (split(/\s+/,$line))[0..2]; # die hier war nur "Kosmetik"
$hash{$_}->{$data_counter}->[$line_counter} = [$spalte1, $spalte2, $spalte3];
$line_counter++;
}
$data_counter++;
}
}

# gib 2. Spalte der 4.Zeile des 2. Datensatzes der 3.Datei aus:
print $hash{2}->{1}->{3}->[1],"\n";
Wie ist "3. Wert der 2. Spalte" definiert?


Edit: ein "]" beim Hash in "}" verwandelt...\n\n

<!--EDIT|renee|1168873176-->
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/
EagleFox
 2007-01-15 16:48
#73232 #73232
User since
2006-04-10
66 Artikel
BenutzerIn
[default_avatar]
ahaa, ich muss mir also erst mal die keys generieren. Das hatte ich bis dahin nicht gecheckt, wie man ohne diese gezielt auf die Daten zugreift!
Super ich danke Dir tausendfach, ich werde das jetzt mal alles ausprobieren.

p.s. mit 3. Wert der 2. Spalte meinte ich, wenn man es sich im Tabellenformat vorstellt, einfach den Wert der 3. Zeile in der 2. Spalte.\n\n

<!--EDIT|EagleFox|1168872728-->
murphy
 2007-01-15 17:26
#73233 #73233
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
@renee: Warum um alles in der Welt sollte man für ein fortlaufend indiziertes Objekt einen Hash statt eines Arrays nehmen?!?
When C++ is your hammer, every problem looks like your thumb.
GoodFella
 2007-01-16 07:45
#73234 #73234
User since
2007-01-09
192 Artikel
BenutzerIn
[default_avatar]
[quote=murphy,15.01.2007, 16:26]@renee: Warum um alles in der Welt sollte man für ein fortlaufend indiziertes Objekt einen Hash statt eines Arrays nehmen?!?[/quote]
Wollte ich auch gerade posten ;)
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
my @files = ('bla_1.txt', 'bla_2.txt', 'bla_3.txt');
my @data;
foreach my $file (@files)
 {
  open(F, "<$file") or die "Konnte $file nicht öffnen.";
  my @tmp = <F>; # Wenn du nur ein paar Spalten speichern willst, musst du @tmp hier bearbeiten.
  close(F);
  push(@data, [ @tmp ]);
 }


..ungetestet.. An die Daten kommst du mit $data[dateinummer][zeilennummer] .. $data[1][3] würde die 4. Zeile der 2. Datei enthalten (in Perl beginnen Indizes bei 0).\n\n

<!--EDIT|GoodFella|1168926440-->
<< |< 1 2 >| >> 16 Einträge, 2 Seiten



View all threads created 2007-01-15 15:15.