Perl - unblessed reference



  • Und was erwartet diese Methode für einen Parameter bzw. übergibst du ihr auch das richtige? Wie gesagt habe ich von Perl keine Ahnung, aber wieso manchmal $ und manchmal @ - wofür steht was?



  • ich glaube nicht das du mir dann weiterhelfen kannst

    aber zur info:
    $ sind wertvariablen
    @ sind arrays
    und % sind hashes - eigentlich indizierte arrays

    da gibts dann noch einige andere feinheiten fuer die ich perl gar nicht gern habe
    aber anforderung ist anforderung

    dafuer ist der regex part in perl einfach unuebertroffen
    es gehoert zur sprache dazu



  • Kannst du mal deine find-Methode ganz posten? Ich bin zwar nicht der absolute Perlprofi, aber ein wenig kenn ich mich (zumindest mit der Syntax) aus. Möglicherweise liegt es auch an einem allgemeinen Problem. Programmiersprachenübergreifend sozusagen 😃



  • okay

    ich poste mal alles das relevant ist

    1. Konstruktor:
    #constructor -> constructs a new object for the object-relational mapping
    sub new{
    	my($classname,$Start_ID) = @_;
    
    	my $self = {
    			ID						=>	$Start_ID,
    			subcategories			=>	undef,			
    			admin_user_id_array		=>	{},
    			parent					=>	undef
    		};
    
    	#define class
    	bless $self, 'GPOOL_Category';
    
    	#get all the users assigned to this category
    	my($query)="SELECT admin_user_id FROM admin_categories WHERE catid=".$Start_ID;
    	my($rs,@columns_arr,@id_array);
    	&main::exec_db(__LINE__,$rs,$query);
    	while(@columns_arr=$rs->fetchrow_array()){
    		push(@id_array, $columns_arr[0]);
    	}
    	$self->{admin_user_id_array} = \@id_array;
    
    	#load the subcategories
    	my(@subcategories,$sth);
    	my($subcategory_query)="select id from category where father=" . $Start_ID;
    	&main::exec_db(__LINE__,$sth,$subcategory_query);
    	if($sth->rows>0)
    	{
    		#go through the result set and create the subobjects
    		my(@result_array);
    		while(@result_array=$sth->fetchrow_array()){
    			$CurrentCategoryObject = new GPOOL_Category($result_array[0]);
    			$CurrentCategoryObject->setParent($self);
    			push(@subcategories, $CurrentCategoryObject);
    		}
    	}
    
    	$self->{subcategories} = \@subcategories;
    	return $self;
    }
    

    und hier die find methode:

    #$object->find($SearchID)
    #method to search the whole subtree and find a node identified by ID=SearchID
    sub find{
    	print STDERR "in find";
    	my($self) = shift;
    	my($SearchID) = @_;
    	my($return) = undef;
    
    	#go through the current node and look if we are at the correct level
    	if($self->{ID} eq $SearchID){
    		$return = $self;
    	}
    	else{
    		#go through all the children of this record
    		foreach $child ( $self->{subcategories} ) {
    			print STDERR "\n\nChild: " .ref($child);
                      #hier entsteht ein problem -->
    			$test_return = $child->find($SearchID);
    		}
    	}
    	return $return;
    }
    

    lg



  • Was mir auffällt, ist dass das Ergebnis von $child->find() einfach in $test_return gespeichert wird, aber nicht weiter ausgewertet wird. Sollte da nicht eine Abprüfung stattfinden, ob es einen gültigen Wert hat und sollte dieser dann nicht zurückgegeben werden bzw. auf $return kopiert werden?? Was ist eigentlich, wenn die SuchID nicht gefunden wird?



  • Was mir auffällt, ist dass das Ergebnis von $child->find() einfach in $test_return gespeichert wird, aber nicht weiter ausgewertet wird. Sollte da nicht eine Abprüfung stattfinden, ob es einen gültigen Wert hat und sollte dieser dann nicht zurückgegeben werden bzw. auf $return kopiert werden?? Was ist eigentlich, wenn die SuchID nicht gefunden wird?

    Ja das ist deswegen weil ich gerade am debuggen bin - das hat schon einmal anders ausgesehen
    die problematik liegt jetzt nich darin das hier nicht das richtige zurueckgeliefert wird sondern darin das der $child->find aufruf mir den fehler "unblessed reference" liefert - also das ganze sei kein objekt sondern ein anderer datentyp (unblessed data type)

    das kommt daher das andscheinend $child zwar ein objekt enthaelt, aber die zuweisund zur klasse des objekts nicht stimmt - obwohl sie vorhanden ist bei der dump ausgabe
    so ein schmarrn!!!!!!



  • Tritt das gleich beim ersten Element im Array auf? Kannst du dir den Inhalt von $child im Debugger anschauen? Könntest du dir nicht eine Hilfsvariable machen vom Typ deiner Klasse und $child darauf zuweisen?

    Was heißt eigentlich der \ vor dem @?



  • AJ schrieb:

    Tritt das gleich beim ersten Element im Array auf? Kannst du dir den Inhalt von $child im Debugger anschauen? Könntest du dir nicht eine Hilfsvariable machen vom Typ deiner Klasse und $child darauf zuweisen?

    Was heißt eigentlich der \ vor dem @?

    ja ich kann mir den inhalt von child im debugger ansehen
    ich bekomme andscheinden ein objekt vom richtigen typ eingebettet in ein array - aber warum das array da ist und wie ich es wegbekomme stellt sich mir die frage

    der \ bedeutet Referenz

    problem ist: es steht das richtige drinnen nur ist es irgendwie gekapselt und ich weiss nicht warum das passiert



  • gomberl schrieb:

    ...
    		#go through all the children of this record
                    @subcat = $self->{subcategories};
    		foreach $child ( @subcat ) {
    ...
    

    Wie wärs so?

    Anscheinend ist ja momentan dein $child ein Array, wenn ich dich richtig verstanden habe. 😕



  • das macht keinen unterschied (hab ich auch schon probiert 😞 )

    der fehler duerfte beid er behandlung von referenzen in perl liegen

    ich schaetze das ich das problem jetzt gefunden habe, nur leider ist der rechner auf dem es laufen soll jetzt gerade nicht verfuegbar
    ich sag im laufe des spaeteren nachmittags bescheid was das problem war - sollte ich es loesen

    danke auf jeden fall das du dir dafuer zeit genommen hast


Anmelden zum Antworten