I got it to work with your changes! I even managed to have a hashtable inside my object, and manipulate it. Perl is a bit more complicated than I thought! ;-)
Thank you very much for you help. George James Edward Gray II wrote: > On Feb 16, 2004, at 2:46 PM, george wrote: > >> I want to parse a long ns log text file, and I've attempted to write >> some >> perl code to do that. I am a newbie, and I haven't managed to get my >> code >> working. > > I'll provide some general comments below. > >> Basically, the ns file contains information about TCP connections and >> I want >> to create a perl object for each connection, and gather some data. The >> code >> that I created is the following: > > Is that one object per line/entry? That sounds like a lot to me. > > Have you considered making a Log object that stores all the information > and provides summery information for it? > > Just out of curiosity, why objects, over say a hash? > > Please post some sample log data, so we can see what we're talking > about here. Help us help you. ;) > >> package Connection; >> >> sub new { >> my ($class) = @_; >> my $self = { >> _packet_ids=> {}, >> _bytes_per_second => [], >> _source_node => undef, >> _destination_node => undef >> }; >> bless $self, $class; >> return $self; >> } > > I like my constructors like this: > > sub new { > my $class = shift; > my $self = { > _packet_ids=> {}, > _bytes_per_second => [], > _source_node => undef, > _destination_node => undef, > @_ > }; > return bless $self, $class; > } > > Which is the same as you have it, except I can override default > parameter choices at object creation. I do realize that you're using > the "_ Means Don't Touch" hint, so this may not be helpful in your > case. I'm pretty lax with object "security". I prefer functionality > and setting parameters in a constructor just makes sense to me. > >> sub addToBytesPerSecond { >> my ( $self, $currentBytesPerSecond) = @_; >> my $atLocation = $self->{_seconds_counter}; >> $self->{_bytes_per_second}[$atLocation] = >> $currentBytesPerSecond; >> print ""; >> } > > I think we can simplify that a little. You just want to push an entry > onto that array, right? > > sub addToBytesPerSecond { > my $self = shift; > push @{ $self->{_bytes_per_second} }, @_; > } > > How's that? You can even add a whole list at once now. > >> sub printBytesPerSecond { >> my ($self) = @_; >> my $loopCounter = 0; >> my $length = scalar($self->{_bytes_per_second}); >> >> while ($loopCounter < $length) { >> print "$self->{bytes_per_second}[$loopCounter]\n"; >> $loopCounter++; >> } >> } > > Good rule of Perl thumb: If you're typing that much for something > simple, like an output loop, you're probably taking the hard road. > Easy things are easy in Perl. > > sub printBytesPerSecond { > my $self = shift; > print "$_\n" foreach @{ $self->{_bytes_per_second} }; > } > >> sub sourceNode { >> my ( $self, $sourceNode ) = @_; >> $self->{_source_node} = $sourceNode if defined($sourceNode); >> return $self->{_source_node}; >> } > > Using objects for everything... names like "sourceNode"... You a Java > guy? :D > > Perl style for subroutine names is generally "source_node". We think > it reads a little better and is easier on our eyes. Just FYi. Use > whatever you like, of course. > > Us Perl guys are also pretty allergic to extra variables we don't need. > We're weird that way. He's how we generally write the above: > > sub source_node { > my $self = shift; > $self->{_source_node} = shift if @_; > return $self->{_source_node}; > } > >> sub destinationNode { >> my ( $self, $destinationNode) = @_; >> $self->{_destination_node} = $destinationNode if >> defined($destinationNode); >> return $self->{_destination_node}; >> } > > I'll let you trim that one, if you like. > >> The sourceNode and destinationNode functions work fine. But the >> printBytesPerSecond and the addToBytesPerSecond functions do not work. >> I can't understand what's wrong with them. Moreover, as you can see I >> also >> want to have a hashtable with the packetIds that have been seen while >> parsing, so as to filter duplicate packets. I didn't even attempt that, >> because I couldn't understand how to insert a scalar into the hash, >> and how >> to retrieve the value. > > See if that gets you going. If not, come back with sample data and > usage code and we'll get you straightened out. > > Good luck. > > James -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] <http://learn.perl.org/> <http://learn.perl.org/first-response>