What is an unblessed reference error?

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • Wiinie
    New Member
    • Feb 2011
    • 47

    What is an unblessed reference error?

    How can I fix the error "Can't call method "id" on unblessed reference" for the following code?

    Code:
    sub language{
    	my $self = shift;
    	if (!$self->{LANGUAGE})
    	{
    		my @language = ();
    		my $statement = $db->prepare("select  languageId, languageName
    										from language");
    		$statement->execute();
    		
    		while(my @array = $statement->fetchrow_array()){
    			my ($id , $name) = @array;
    			my $object = Language->new();
    			$object->id($id);
    			$object->name($name);
    			push (@language, $object);	
    		}			
    		$self->{LANGUAGE} = \@language;
    	}
    	return $self->{LANGUAGE};
    }
    
    my @languagetest = language();
    
    			foreach my $current(@languagetest){
    			my $id = $current->id();
    			my $name = $current->name();
    			print "RETURN ID: [$id]  Name: [$name] \n";
    			}
    Last edited by Niheel; Feb 25 '11, 04:13 PM.
  • miller
    Recognized Expert Top Contributor
    • Oct 2006
    • 1086

    #2
    You do not show the code where the problem occurs. You create an object there:

    Code:
    my $object = Language->new();
    Therefore in the new method of the Language class, you should be returning a blessed data structure as is required in perl OOP (Object Oriented Prgramming). Where's your new method? are you blessing a hash or such?

    perldoc: perltoot - Tom's object-oriented tutorial for perl

    - Miller

    Comment

    • Wiinie
      New Member
      • Feb 2011
      • 47

      #3
      I try using foreach to print out the result
      Code:
      # my @languagetest = language();
      #  
      #             foreach my $current(@languagetest){
      #             my $id = $current->id();
      #             my $name = $current->name();
      #             print "RETURN ID: [$id]  Name: [$name] \n";
      #             }
      and it gives me an error of unblessed reference when i call the method id() again.. please help me to solve this problem. or does it have another to print out the result.
      Last edited by Niheel; Feb 27 '11, 03:03 AM.

      Comment

      • miller
        Recognized Expert Top Contributor
        • Oct 2006
        • 1086

        #4
        Yes, because $current is not an object. You should know what type of data structure $current is, but if you don't use Data::Dumper

        Code:
        use Data::Dumper;
        
        my @languagetest = language();
        
        foreach my $current (@languagetest) {
        	print Dumper($current);
        	my $id = $current->id();
        	my $name = $current->name();
        	print "RETURN ID: [$id] Name: [$name] \n";
        }

        Comment

        • Wiinie
          New Member
          • Feb 2011
          • 47

          #5
          Thank so very much for the above answer.
          And I have another question as well. I did use the selectall_array _ref to execute this query. and when I try to print in the sub nextWords. it does work and prints out all the result that i have expected.


          Code:
          sub nextWords {
          	my ($id, $offset) = @_;
          	my @array = ();
          	my $statement = $db->selectall_arrayref("select word from words 
          			left outer join language
          			on words.languageId = language.languageId
          			where words.languageId = $id
          			order by word asc
          			limit 10 offset $offset;");
          			
          	my @main= ();
          	foreach my $i (@$statement)
          	{
          		push(@main, @{$i}[0]);
          	}
          	@array[$id] = [@main];
          	
          	return  @array; 
          }	
          
          my $lang_size = languages();
          for my $id(1 .. $lang_size ){
          	
          	print "=======ID = " . $id . "=======\n";
          	my $self->{CURRENTOFFSET}  = 0;
          	NAME: while (1 > 0){
          		my @newwordsList = nextWords($id,$self->{CURRENTOFFSET});
          		
          		$self->{CURRENTOFFSET}+= 10;
          		
          		foreach my $k (@{@newwordsList[$id]}) {
          			print $k . "\n";
          		}
          		print "\n";
          		if (!@{@newwordsList[$id]}[0]) {
          			last NAME;
          		}
          	}
          }
          However, when i try to print out by create and other file.pl to compile it. it doesnt work, it give an error "DBD::SQLite::d b selectall_array ref failed: unrecognized token: "0x1db16c".

          Code:
          $object = DataLayer->new();
          print $object->nextWords();
          
          for my $id( 1 .. 3)
          	{
          		my $offset= 0;
          		NAME: while (1>0)
          		{
          			my @wordList = $object->nextWords($id, $offset);
          			$offset+=10;
          			foreach my $k (@{@wordList[$id]}) {
          			print $k . "\n";
          			}
          			if (!@{@wordList[$id]}[0]) {
          			last NAME;
          			}
          		}	
          	}
          thanks in advance..
          Last edited by Niheel; Feb 27 '11, 03:03 AM. Reason: please use code tags

          Comment

          Working...