Mr and Mrs Monks, I am new to OO perl and have stumbled into this problem. I have a fairly basic object, but I can’t get it to do what I want. When I try to create multiple instances I get a whole bunch of references to the same thing. I am not sure what I am doing wrong, most of my code came straight from the documentation. Here is the code for the object,
#!/usr/local/perl -w package VRTSAgent; use Carp; use Data::Dumper; ####################################### ## This is the ADT for an agent. ####################################### my %fields = ( agent =>undef, os =>%os, version =>@versions, ); sub new { my $class = shift; my $self = {%fields}; bless $self, $class; return $self; } sub agent { if ($_[1]) { $agent = $_[1]; } return $agent; } sub version { if ($_[2]) { $version[$_[1]]=$_[2]; } return $version[$_[1]]; } sub os { if ($_[3]) { $os{$_[1]}{$_[2]} = $_[3]; } return $os{$_[1]}{$_[2]}; } sub os_keys { return keys (%os); } sub os_key_each{ return keys ( %{$os{$_[1]}} ); } sub _dump_os { print Dumper(\%os); } sub make_Versions { my ($key, @keys, @each, %ver); @keys = &os_keys; foreach $key (@keys) { @each = keys ( %{$os{$key}} ); foreach $tmp (@each) { $ver{$tmp}=1; } } @versions = keys (%ver); @versions = sort @versions; } sub get_versions { return @versions; } sub DESTROY { }
and here is how I am using that code.
#!/usr/bin/perl -w use strict; use VRTSAgent; use Data::Dumper; my (@lines, $i, @tmp); my (@agents, @keys); my ($infile, $outfile); $infile = "matrix.csv"; $outfile = "out.csv"; open (INFILE, $infile); while (<INFILE>) { chomp; push @lines, $_; } close INFILE; my $j = -1 ; my $lastAgent = "something thats not an agent"; my (@osKey, $var, $var2, $var3, @tmp2, $agent); for ($i=2; $i < @lines; $i++) { @tmp = split /,/,$lines[$i]; if($lastAgent ne $tmp[3]){ $agents[++$j]= new VRTSAgent; $agents[$j]->new(); $lastAgent = $tmp[3]; $agents[$j]->agent($tmp[3]); print "New Agent == $tmp[3]\n"; } $agents[$j]->os($tmp[1]." ".$tmp[2],$tmp[4]." ".$tmp[5],$tmp[6]); @tmp = undef; } foreach $var (@agents) { $var->make_Versions; } my @ver; foreach $var (@agents) { $agent = $var->agent; @ver= $var->get_versions; foreach $var2 (@ver){ #print "$agent $var2 \n"; } }
What I want is to have a separate object for all of the different objects, instead I end up with one object and an array full of ?pointers/references? to the same one. If anyone has suggestions on how to make this do what I want or how to improve either piece of code I would be grateful. Here are some typical lines of input data,
SUN,Solaris 8 ,64-bit,Oracle ServerFree,9.0.1,64-bit,yes, IBM,AIX 4.3.3 ,64-bit,SAP,3.x ,64-bit,yes, IBM,AIX 4.3.3 ,64-bit,SAP,4.x,,yes, HP,HP-UX 11.11 ,32-bit,Sybase ,ASE 12.0,,yes,4.5A HP,HP-UX 11.11 ,64-bit,Sybase ,ASE 12.0,64-bit,yes,4.5A SGI,IRIX 6.5.10; 6.5.11; 6.5.12 ,64-bit,Sybase ,ASE 11.9.2,,yes,
Thanks again

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

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.