Schrift
[thread]6476[/thread]

mehrdimensionale Arrays: Elemente hinzufügen

Leser: 3


<< |< 1 2 >| >> 17 Einträge, 2 Seiten
peggy
 2004-08-09 14:19
#85606 #85606
User since
2004-07-23
29 Artikel
BenutzerIn
[default_avatar]
Hallo!
Ich habe eine datei die ich in ein mehrdimensionales array packen will damit ich besser damit arbeiten kann. Wie füge ich denn bei einem zweidimensionalen array ein element an eine bestimmte stelle? Mit der splitfunktion wird doch normalerweise die einzelnen elemente in ein array geschrieben. Ich habe hier ein array mit elementen, die ganze stringzeilen enthalten, diese will ich an den lehrzeichen spliten und in ein mehrdimensionales array packen.
Struktur jetzt
array [zeile,zeile,zeile]
Struktur haben will:
Code: (dl )
1
2
3
array{ [wort,wort,wort],#ehemalige zeile
[wort,wort,wort],
}


versucht mit:
Code: (dl )
@tabelle=([$i],[$y])=$element;#zuweisen eines elementes geht so nicht


edit: meine datei sieht quasi so aus:
        name name name
name code  code    code
name code  code    code
name code  code    code

ich will dies genauso in einem array haben!\n\n

<!--EDIT|Crian|1092047926-->
Crian
 2004-08-09 14:28
#85607 #85607
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
http://wiki.perl-community.de/bin/view/Wissensbasis/AoA

Code: (dl )
1
2
3
4
5
6
my @array1 = ("Ganze Sätze", "sollen an Leerstellen", "aufgespalten werden");
my @array2;
push @array2, [ split / /, $_ ] for @array1;

use Data::Dumper;
print Dumper \@array2;


Ausgabe:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$VAR1 = [
         [
           'Ganze',
           'Sätze'
         ],
         [
           'sollen',
           'an',
           'Leerstellen'
         ],
         [
           'aufgespalten',
           'werden'
         ]
       ];
\n\n

<!--EDIT|Crian|1092047786-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
peggy
 2004-08-09 15:15
#85608 #85608
User since
2004-07-23
29 Artikel
BenutzerIn
[default_avatar]
Huhu!
Leider teilt er nicht zwischen den wörtern, ich erhalte das gleiche array wie in @zeilen:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
open(FILE, "testdatei.txt") or die("oops: $!\n");
$/ = undef;
$data = <FILE>;
close FILE;

my @zeilen = split(/\n/,$data);
my @tabelle;
push @tabelle, [ split / /,$_] for @zeilen;

use Data::Dumper;
print Dumper \@tabelle;


Ausgabe:
$VAR1 = [
[
' apfel banane baum grün rot ast bielef regen obst pflanze'
],
[
'apfel 1.000 0.700 0.700 0.809 0.500 0.702 0.200 0.301 0.902 0.609 '
],
[],
[
'banane 0.700 1.000 0.500 0.200 0.100 0.300 0.101 0.203 0.902 0.609'
],
[],
[
'baum 0.700 0.500 1.000 0.803 0.100 0.900 0.500 0.702 0.803 0.904'
],
[],
[
'grün 0.809 0.200 0.803 1.000 0.800 0.600 0.300 0.703 0.605 0.803'
],
[],
[
'rot 0.500 0.100 0.100 0.800 1.000 0.300 0.209 0.309 0.609 0.308'
],
[],
[
'ast 0.702 0.300 0.900 0.600 0.300 1.000 0.304 0.309 0.700 0.809 '
],
[],
[
'bielef 0.200 0.101 0.500 0.300 0.209 0.304 1.000 0.900 0.600 0.300'
],
[],
[
'regen 0.301 0.203 0.702 0.703 0.309 0.309 0.900 1.000 0.800 0.800'
],
[],
[
'obst 0.902 0.902 0.803 0.605 0.609 0.700 0.600 0.800 1.000 0.900'
],
[],
[
'pflanze 0.609 0.609 0.904 0.803 0.308 0.809 0.300 0.800 0.900 1.000'
]
];
editiert: vertan hatte\n\n

<!--EDIT|peggy|1092050261-->
renee
 2004-08-09 15:28
#85609 #85609
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
probier mal:
Code: (dl )
push @tabelle, [ split(/\s+/,$_)] for @zeilen;


statt:
Code: (dl )
push @tabelle, [ split / /,$_] for @zeilen;


Vielleicht ist es ja mit Tabulator getrennt und nicht mir Leerzeichen...\n\n

<!--EDIT|renee|1092050935-->
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/
peggy
 2004-08-09 15:33
#85610 #85610
User since
2004-07-23
29 Artikel
BenutzerIn
[default_avatar]
Ha! Wiedermal ein großes Dankeschön an euch für die fluxe antwort :) Funzt jetzt
Crian
 2004-08-09 16:03
#85611 #85611
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Du sagtest oben Du wollest an Leerzeichen splitten, daran hab ich mich gehalten :)
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
peggy
 2004-08-09 16:17
#85612 #85612
User since
2004-07-23
29 Artikel
BenutzerIn
[default_avatar]
huhu!
weiter gehts bei meinem problem. Entweder bin ich blind oder ich seh den felher einfach nicht! Warum erhalte ich hier keine ausgabe:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
for my $spalte(1..$laenge)
{
for my $zeile(1..$laenge)
{
if ($tabelle[$spalte][$zeile]== $_ || $tabelle[$spalte][$zeile]<$limit)
{last;}
elsif($tabelle[$spalte][$zeile]>=$limit)
{
if ($tabelle[0][$zeile]!=$tabelle[$spalte][0])
{

$paare{$tabelle[0][$zeile]}=$tabelle[$spalte][0];
}else{last; print "gleiches Wort";}
}
}
}
(...)
Code: (dl )
1
2
3
4
while(($schluessel,$wert)=each(%paare))
{
print "Der Wert von $schluessel ist $wert!";
}
Crian
 2004-08-09 16:20
#85613 #85613
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
[s]Wo wird der Hash %paare denn definiert?[/s] Ev. fehlt einfach das my vor der Klammer mit Schlüssel und Wert. Du arbeitest doch wohl hoffentlich mit use strict?

Was möchtest Du, das ausgegeben werden soll?


Edit: Ich bin blind ... ich muss Deinen Code erstmal umrücken, um ihn zu verstehen...\n\n

<!--EDIT|Crian|1092054179-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
renee
 2004-08-09 16:21
#85614 #85614
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
1.) Du vergleichst Elemente der Tabelle mit ==. Oben sind aber Worte der Inhalt der Tabelle. Strings vergleicht man mit eq.
2.) Was ist in $_ ??
3.) Du hast das last; vor der print-Anweisung
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/
Crian
 2004-08-09 16:32
#85615 #85615
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Ohne wirklich zu verstehen, was Du erreichen willst und wie die Daten aussehen, hab ich diesen Code geschrieben:

(Was ist $_ bei Dir? Wie sehen die Daten aus?)

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
#!/usr/bin/perl
use strict;
use warnings;

my @data = <DATA>;
my @t;
push @t, [ split /\s+/, $_ ] for @data;

my $limit = 17;
my %p;

$_ = 9;

for my $s (0..$#t) {
   for my $z (0..$#{$t[$s]}) {
       if (
           $t[$s][$z] == $_     or
           $t[$s][$z] <  $limit
          )
       {
           last;
       }
       elsif ($t[$s][$z] >= $limit) {
           if ($t[0][$z] != $t[$s][0]) {
               $p{$t[0][$z]} = $t[$s][0];
           }
           else {
               print "gleiches Wort";
               last;
           }
       }
   }
}

while (my ($schl,$wert) = each(%p)) {
   print "Der Wert von $schl ist $wert!\n";
}


_ _ D A T A _ _
0 10 20 30
10 1 2 3
20 2 3 4
30 3 4 5


Ausgabe: Der Wert von 0 ist 30!


Nutzt das was?\n\n

<!--EDIT|Crian|1092054926-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
<< |< 1 2 >| >> 17 Einträge, 2 Seiten



View all threads created 2004-08-09 14:19.