Schrift
[thread]12130[/thread]

Problem mit Array aus Objekten

Tags: Ähnliche Threads

Leser: 1


<< >> 9 Einträge, 1 Seite
Gast Gast
 2008-07-04 16:16
#111812 #111812
Hallo zusammen,

ich stehe vor einem Problem für dass ich derzeit keine Lösung finde. In einer foreach-Schleife fülle ich ein Array mit verschiedenen Objekten. Im Code sieht das in etwa so aus:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
foreach $key (keys%wordcounter){

        my $keyword = Word->new($key);
        # ... hier passieren noch einige nicht relevante Dinge

        push @keywords, $keyword;       
        print "Test: ".$keyword->getName()."\n";

}

foreach my $wd(@keywords){
        print "Test: ".$wd->getName()."\n"; 
}


In einer zweiten foreach Schleife an anderer Stelle im Programm möchte ich nun auf einzelne Objektfunktionen zugreifen. Die Testausgabe in der ersten Schleife gibt den richtigen Namen aus. Die Testausgabe in der zweiten Schleife liefert immer nur:

Test: @_

Kann mir irgendwer helfen und sagen was ich hier falsch mache?

Viele Grüße,

Marcel
renee
 2008-07-04 16:23
#111814 #111814
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Kannst Du hier ein minimales Programm posten, das den Fehler reproduziert??
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/
Gast Gast
 2008-07-04 17:00
#111820 #111820
Unglücklicherweise kann ich das nicht. Ich habe das ganze gerade nocheinmal in einem abgespeckten Programm nachgestellt und dort funktioniert genau dies einwandfrei :( Hier mal der genaue Codeauszug aus meinem Programm:

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
37
38
39
40
41
42
43
44
45
46
47
48
# hash that counts appearance of a word
my %wordcounter;

# collected words
foreach (@words){
if (length $_ >= 2){
chomp $_;                       # remove newline
$_ =~ s/[!:.,?()#]//g;    # remove possible symbols
#print $_."\n";

# increase wordcounter
$wordcounter{$_}++;
};      
}

my $position;
my @keywords;
my $keyword;

# print out words from wordcounter
foreach $key (keys%wordcounter){
        
        foreach(@blacklists){
        # check if a word is blacklistet
        # if it is not, all positions that have been found in the file are recorded
        if ($_->validate($key)){
                $keyword = HTML_Indexer::Word->new($key);
                
                # save all positions
                #for(1..$wordcounter{$key}){
                #               #print $key." : ".$wordcounter{$key}."\n";
                #               $position = new HTML_Indexer::Position($filename, $anchorid);
                #               $keyword->addPosition($position);       
                #       }
                        
                push @keywords, $keyword;       
                print "Test: ".$keyword->getName()."\n";
                }
        else {
                        print $key." : BLACKLISTED \n";
                }
        }
}

# Testoutput => Hier tritt der Fehler auf!
foreach my $wd(@keywords){
        print "Test: ".$wd->getName()."\n"; #output is alway @_ ??;
}





Gast Gast
 2008-07-04 17:01
#111821 #111821
Bei dem Programm handelt es sich um einen HTML Indexer, der HTML Files parst auf Stichwörter untersucht und sich diese unter Berücksichtigung von Ausschlusslisten merkt mit Dateinamen und Position merkt.
Zu Beginn des Teilprogramms ist das Einlesen und Wörter herausfiltern (aus einer Datei) bereits geschehen. Die gefundenen Wörter werden nun mit der Häufigkeit ihres Auftretens in einen Hash gesschrieben.
Danach wird der Hash abgearbeitet und es wird eine Liste mit Wortobjekten erstellt, die später sämtliche Dateipfade und Wortvorkommen enthält.
Und genau hier ist das Problem. Das Anlegen der Wortobjekte klappt noch tadellos. Will ich hinterher wieder auf Wörter aus der Liste zugreifen, so funktioniert dies scheinbar nicht.
Gast Gast
 2008-07-04 17:12
#111824 #111824
Hier nochmal der Aufbau der Klasse Word:

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
37
38
39
40
package HTML_Indexer::Word;
use HTML_Indexer::Position;
use HTML_Indexer::HeadlinePosition;

my $wordname;
my @positions;
my @headline_positions;


sub new (){
        my $classname  = shift;     
        $wordname = shift; 
        print "Creating word: ".$wordname."\n";
        my $self       = {};            
        $counter++;
        return bless $self, $classname; 
};


sub addPosition(){
        my $classname  = shift;         # 1. Parameter Klassenname
        my $position = shift; 
        push @positions, $position; 
};


sub addPositions(){
        my $classname  = shift;         # 1. Parameter Klassenname
        my @pos = shift; 
        push @positions, @pos; 
};


sub getPositions(){
        return @positions; 
}

sub getName(){
        return $wordname;       
}
KurtZ
 2008-07-04 17:16
#111826 #111826
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
ich verstehe dein Problem nicht ganz ... aber vielleicht wäre es mal ein Tip deine Datenstrukturen im kompletten Programm CPAN:Data::Dumper zu inspizieren?

Vielleicht lieber CPAN:Smart::Comments, dann bleibt dein Code minimal beeinflusst.

so kannst du eingrenzen, wo etwas schief läuft.
TMTOWTDYOG (there's more than one way to dig your own grave)
KurtZ
 2008-07-04 17:20
#111827 #111827
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
Gast+2008-07-04 15:12:37--
Code (perl): (dl )
1
2
3
4
5
sub addPositions(){
        my $classname  = shift;         # 1. Parameter Klassenname
        my @pos = shift;                    # <---- SORRY ??? 
        push @positions, @pos; 
};
TMTOWTDYOG (there's more than one way to dig your own grave)
KurtZ
 2008-07-04 17:25
#111828 #111828
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
außerdem sei my $wordname eine Klassenvariable, die in new immer neu gesetzt wird ???
TMTOWTDYOG (there's more than one way to dig your own grave)
KurtZ
 2008-07-04 17:31
#111829 #111829
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
sollten außer in new() nicht immer self statt class als erster Parameter übergeben werden?

also entweder du hast ein sehr avantgardistisches Objektmodell oder du stürzt gerade an einer viel zu steilen Lernkurve herab ...
TMTOWTDYOG (there's more than one way to dig your own grave)
<< >> 9 Einträge, 1 Seite



View all threads created 2008-07-04 16:16.