Schrift
[thread]12391[/thread]

Variabler Variablenname (Seite 2)

Leser: 35


<< |< 1 2 3 >| >> 22 Einträge, 3 Seiten
Gast Daniel
 2009-04-28 16:51
#120986 #120986
Ich hab da irgendwie ein Problem, dass eigentlich in diesem Post beantwortet wurde-allerdingsklappt das bei mir nich... mein Code:
Code: (dl )
 push(@file_3_[$i],$array_file3[$i]);	

Wäre $i hier z.B. "2" soll also an das Array @file_3_2 der 3.Eintrag, also $array_file3[2] angehängt werden... wird aber leider nicht. Perl sagt mir:

Quote
Type of arg 1 to push must be array (not array slice) at /na/home/jungd/bin/Glaskugel line 91, near "])"


Weis jemand von euch an was es liegen könnte?
pq
 2009-04-28 16:57
#120988 #120988
User since
2003-08-04
12209 Artikel
Admin1
[Homepage]
user image
Code (perl): (dl )
push @{ $file_3[$i] }, $array_file3[$i];
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
Gast Daniel
 2009-04-29 08:55
#121004 #121004
Danke schön!
Kannst du mir evtl irgendwie erklären was genau dabei abläuft?
topeg
 2009-04-29 17:41
#121023 #121023
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Code (perl): (dl )
push @{ $file_3[$i] }, $array_file3[$i];
ist gleichbedeutend mit:
Code (perl): (dl )
1
2
3
4
5
6
7
# wert Auslesen
my $value_von_array_file_3_i=$array_file_3[$i];
# Referenz auf ein Array auslesen
my $value_von_file_3_i=$file_3[$i];
# Das Array derefenezieren ( das macht das "@{}") und
# das Element dem Array hinzufügen
push( @{$value_von_file_3_i}, $value_von_array_file_3_i );
LanX-
 2009-04-29 18:11
#121025 #121025
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
Guest Daniel
Danke schön!
Kannst du mir evtl irgendwie erklären was genau dabei abläuft?


Präzedenzregeln:
Code (perl): (dl )
@file_3_[$i]
ist gleichbedeutend zu
Code (perl): (dl )
@{file_3_} [$i]
was aber ein Hashslice ist!

Deswegegen musst du klammern!
Last edited: 2009-04-29 18:13:52 +0200 (CEST)
pq
 2009-04-29 19:05
#121026 #121026
User since
2003-08-04
12209 Artikel
Admin1
[Homepage]
user image
2009-04-29T16:11:53 LanX-
Code (perl): (dl )
@file_3_[$i]
ist gleichbedeutend zu
Code (perl): (dl )
@{file_3_} [$i]

nee, das zweite wird von perl als ${file_3_} [$i] interpretiert.
Quote
was aber ein Hashslice ist!

ein hashalice sieht so aus: @hash{"foo", "bar"}
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
LanX-
 2009-04-29 19:17
#121027 #121027
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
sorry, ich meinte natürlich arrayslice wie in seiner fehlermeldung

Weil eine einelementige Liste rauskäme, ist ${file_3_} [$i] inkorrekt.

http://faq.perl.org/perlfaq4.html#What_is_the_diff...
Last edited: 2009-04-30 00:18:56 +0200 (CEST)
Gast Daniel
 2009-05-12 09:54
#121522 #121522
Ok, mittlerweile bin ich soweit durchgestiegen, nur komm ihc bei meinem neuen Problem wieder nicht auf eine adäquate Lösung...
Ich habs bisher so gelöst, dass ich ein csv - File mit dem Befehl
Code (perl): (dl )
1
2
3
4
5
while (<FILETOREAD>) { # read each line of file, one at a time
        $xyz = $_;
        push(@values1,[split(/\,/,$xyz)]);
}
close (FILETOREAD);


Jetzt möchte ich das skript aber in eine Schleif stecken, der man ein Array an filenames übergibt, und dass dann die Arrays, die hier noch fix nummeriert sind (@values1) mit einem Zähler durchnummeriert, also für das erste File dann @values1, für das zweite @values2 usw.
Mein Gedanke war dann das so zu lösen:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@files_to_read = @ARGV;
$arrayzaehler = 1;
foreach (@files_to_read){
$filename = $_;
#Einlesen und Speichern der Datenfiles
open (FILETOREAD, "<$filename") || die "Can't open $filename: $!";
while (<FILETOREAD>) { # read each line of file, one at a time
        $i++;
        chomp;
        if (/^\#/){ next } #Kommentarzeilen im .csv-file überspringen
        s/\s*//g;
        $xyz = $_;
        @zeile = split(/\,/,$xyz);
        push @{ @values[$arrayzaehler] }, [split(/\,/,$xyz)];

$arrayzaehler = ++$arrayzaehler;
        

}
Allerdings kommt da irgendwie nur Mist bei raus...
Weis jemand von euch warum?
Taulmarill
 2009-05-12 10:19
#121524 #121524
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
Du zählst den Array innerhalb der while-Schleife hoch. Der müsste aber in der foreach-Schleife gezählt werden.

Den Zähler kannst du auch einfach umgehen, indem du einen Hash anstatt eines Arrays benutzt
Code (perl): (dl )
push @{ $values{$filename} }, [split(/\,/,$xyz)];
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
topeg
 2009-05-12 10:24
#121525 #121525
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
etwas überarbeitet:
Code (perl): (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
#!/usr/bin/perl
use strict;
use warnings;

my @files_to_read = @ARGV;

# vorher initalisieren ist besser
my @values;

foreach my $filename (@files_to_read)
{
  #Einlesen und Speichern der Datenfiles
  open (FILETOREAD, '<', $filename) || die "Can't open $filename: $!";

  # read each line of file, one at a time
  while (my $line = <FILETOREAD>)
  {
    
    chomp($line);

    if ($line=~/^\#/){ next } #Kommentarzeilen im .csv-file überspringen

    $line=~s/\s+//g;

    # das reicht völlig aus
    # so hängst du an das Array @values
    # eine Arrayrefenzen mit den den gesplitteten Werten an
    # das ist ein Array of Arrays
    push(@values, [split(/\,/,$line)]);

  }
  close(FILETOREAD);
}

# mal alles ausgeben
print join(', ', @$_)."\n" for(@values);
<< |< 1 2 3 >| >> 22 Einträge, 3 Seiten



View all threads created 2008-08-22 14:46.