in reply to When I try to create different objects i end up getting the same one over and over...

If you have not already read the numerous tutorials on Perl OO, please do so: perltoot, perlboot, and our own Tutorials.

You have quite a number of problems with your code, i'll attemp to rewrite some of your code, but not all. Try this out:

use strict; use Data::Dumper; my @agents; open (FH,'matrix.csv'); while(<FH>) { chomp; push @agents, VRTSAgent->new(split(/\s*,\s*/,$_,6)); } close FH; print Dumper $_ for @agents; package VRTSAgent; use strict; use Carp; use Data::Dumper; sub new { my $class = shift; my $self = _init(@_); return bless $self, $class; } sub _init { my %init = ( agent => undef, os => [shift,shift], version => [@_], ); return \%init; } # here is how i would code _dump_os # note: if the client is going to call a method # then don't prefix that method with an underscore! # only private methods should be prefixed with underscores sub dump_os { my $self = shift; print Dumper($self->{os}); } # you could call it like so: $_->dump_os for @agents;
I see no reason to store the data file in a transitory array, better to just make the object as you parse the line. So, each line is read and split on a comma with optional surrounding whitespace. The results are passed to the object's constructor, which passes them to it's internal _init() method.

I totally got lazy with the _init() method - this is not good code (see Shift versus Sanity for discussions on why) , but i hope this gives you a new perspective on a hard part of this problem - turning each data piece into an attribute. Good luck, and let us know if you have any other problems in your endeavor.

jeffa

L-LL-L--L-LL-L--L-LL-L--
-R--R-RR-R--R-RR-R--R-RR
B--B--B--B--B--B--B--B--
H---H---H---H---H---H---
(the triplet paradiddle with high-hat)
  • Comment on (jeffa) Re: When I try to create different objects i end up getting the same one over and over...
  • Download Code

Replies are listed 'Best First'.
Re: (jeffa) Re: When I try to create different objects i end up getting the same one over and over...
by krujos (Curate) on Apr 26, 2002 at 16:32 UTC
    can you tell me more about what
    os => [shift,shift],
    is doing. its not the shift that I am confused about but rather what the data structure is now. In the original code that was a hash, but I am not sure what that syntax would make it. thanks Josh
      I thought about why you chose a hash and didn't see the benefit. I guess i need to see your requirements first before making that judgement, but again, my point was to show you how to get the most out of Perl - how to break away from C-style coding.

      The resulting data structure is an array reference. This may not be what you want, however. Check this out (assuming your data file):

      $_->dump_os for @agents; # yields: $VAR1 = [ 'SUN', 'Solaris 8' ]; $VAR1 = [ 'IBM', 'AIX 4.3.3' ]; # etc.
      Again, since i really do not know what your target is, i had to improvise. Now is the time when i wish i could be at your computer ... but alas ... if you want to continue this disussion, let's work via /msg and scratchpad's - no need to waste database space. ;)

      UPDATE:
      After some discussion via /msg's, i feel that storing the os's in a hash is not necessary at all. If you store them in an array reference as i have done, you can test for a particular OS by using grep. Here is an example:

      foreach (@agents) { $_->dump_os if grep /AIX/, @{$_->{os}}; }
      Of course, you could also grep a hash, but that seems a bit like using a square on a round hole to me. ;) Good luck!

      jeffa

      L-LL-L--L-LL-L--L-LL-L--
      -R--R-RR-R--R-RR-R--R-RR
      B--B--B--B--B--B--B--B--
      H---H---H---H---H---H---
      (the triplet paradiddle with high-hat)
      
        jeffa thank you so much for your help, you have been great. I have been playing around with this a little more this afternoon, there is one thing I cant figure out. How do I refrence a specific element in os now? thanks Josh