[wellylug] perl hacking
Jamie Baddeley
wellylug at vpc.co.nz
Thu Apr 14 23:41:22 NZST 2005
Thanks for your comprehensive reply Grant - it's much appreciated.
In the end I looked closer at the splitnamevalue subroutine, modified
that and it burst into life.
BTW, if I ever showed my face at a perl mongers meeting, I'd be more
appropriately named a perl mongrel :-)
Cheers
jamie
On Thu, 2005-04-14 at 22:44 +1200, Grant McLean wrote:
> Hmm
>
> Without knowing exactly what the output of that snmpwalk command looks
> like, it's a bit hard to say. It looks to me like your Perl code and
> awk code are trying to grab bits of the output in slightly different
> ways and the Perl code probably isn't doing what the author intended
> anyway.
>
>
> > snmpwalk -v 2c $host -c community hrStorageAllocationUnits.$drive|awk
> > '{print $4}'
>
> That awk snippet will replace each line with the contents of the fourth
> 'field' where fields are delimited by whitespace. That's pretty
> straightforward, but the Perl code is doing something entirely
> different.
>
>
>
> > sub getblocksize {
> > $blocksize=`snmpwalk -v 2c $host -c $community hrStorageAllocationUnits.$drive 2>/dev/null`;
>
> That code slurped in the output of snmpwalk.
> Was it one line of output or multiple lines (one per drive?).
> The next line seems to assume it's one line:
>
> > ($name,$blocks)=split(/ = /, chomp($blocksize));
>
> This looks like a bug. I'd guess that the chomp was intended to discard
> the last newline and the split is meant to operate on the chomped
> result. But chomp actually modifies the named argument and returns the
> number of characters chomped. '1' in this case.
>
> The split is then trying to use the string ' = ' as a delimiter to split
> the line into fields and store the first two fields in $name and $block.
> Unfortunately the string '1' doesn't contain any ' = ' so $name ends up
> containing '1' and $blocks ends up undefined.
>
> > $blocks=&splitnamevalue($blocksize);
>
> This is taking the original output from snmpwalk (minus the chomped
> trailing newline) and passing it to another subroutine. From the name
> I'd guess it's going to do something similar to what the failed split
> command above was trying to do. The return value from the subroutine is
> overwriting that '1' we stored in $ blocks a moment ago.
>
> > $blocks=~s/\ .*//;
>
> This seems to be discarding the first whitespace character and anything
> that follows it.
>
> > return $blocks;
>
> If all you want is the fourth field then try this:
>
> my $data = `snmpwalk -v 2c $host -c $community
> hrStorageAllocationUnits.$drive 2>/dev/null`;
>
> my @fields = split(/\s+/, $data);
> return $fields[3];
>
> The array index is '3' since Perl arrays number from 0. Whether that's
> any use to you I don't know.
>
> If you're looking to improve your Perl, might I suggest coming along to
> Perl Mongers? (http://wellington.pm.org/)
>
> Cheers
> Grant
>
>
More information about the wellylug
mailing list