Re: [Boston.pm] getting values out of symbol tables
At 2:18 PM -0500 1/17/03, John Saylor wrote: Hi ( 03.01.17 13:56 -0500 ) Dan Sugalski: Typeglobs are all that's in symbol tables. You need to look in the globs if you want to get values. But how do I do this? Do I open () them? Do I dereference them? I've been digging through the camel book [and writing test scripts] without success. Any pointers or suggestions welcome. Use the *foo{thing} syntax, where thing is IO, SCALAR, ARRAY, HASH, FORMAT, and so on. Info's in the perl docs, in perldata. -- Dan --"it's like this"--- Dan Sugalski even samurai [EMAIL PROTECTED] have teddy bears and even teddy bears get drunk ___ Boston-pm mailing list [EMAIL PROTECTED] http://mail.pm.org/mailman/listinfo/boston-pm
Re: [Boston.pm] getting values out of symbol tables
At 13:45 -0500 2003.01.17, John Saylor wrote: >I have a project where I am trying to dump all the variable names and >values in a given package namespace. I can get all the variable names >OK, it's just getting the values from those names that I am not able to >do. > >I have some code like this: >foreach $key ( keys %main::Package:: ) { > $val = $WW::Package::{$key}; > print "$key\t$val\n"; >} > >but all I get is typeglobs. Here is one way: #!perl -w use strict; for my $name ( keys %strict:: ) { no strict 'refs'; my $val = *{"strict::$name"}{SCALAR}; next if !defined $val || !defined $$val; print "\$strict::$name = $$val\n"; } Produces: $strict::VERSION = 1.01 Peek inside the glob for the value you want (in this case, SCALAR), and if it is defined, deref it and print it. Note that the above works for scalars only. Here's a more robust version handling arrays and hashes too, using even more soft references, with Time::localtime as the package. #!perl -w use Time::localtime; no strict 'refs'; my $pkg = 'Time::localtime'; for my $name ( keys %{$pkg . '::'} ) { for my $type ( qw(SCALAR ARRAY HASH) ) { my $val = *{ "${pkg}::$name" }{ $type }; # val is a reference next unless defined $val; if (ref $val eq 'SCALAR') { next unless defined $$val; print "\$${pkg}::$name = $$val\n"; } elsif (ref $val eq 'ARRAY') { next unless @$val; my $data = join "', '", @$val; print "\@${pkg}::$name = ('$data')\n"; } elsif (ref $val eq 'HASH') { next unless scalar %$val; my $data = join "', '", %$val; print "\%${pkg}::$name = ('$data')\n"; } } } Produces: @Time::localtime::ISA = ('Exporter', 'Time::tm') @Time::localtime::EXPORT = ('localtime', 'ctime') %Time::localtime::EXPORT_TAGS = ('FIELDS', 'ARRAY(0x50498)') $Time::localtime::VERSION = 1.01 @Time::localtime::EXPORT_OK = ('$tm_sec', '$tm_min', '$tm_hour', '$tm_mday', '$tm_mon', '$tm_year', '$tm_wday', '$tm_yday', '$tm_isdst') Note that it is not recursive, so you get an ARRAY ref there. And of course, there are many ways the formatting could be messed up by the data. Data::Dumper to the rescue! #!perl -w use Data::Dumper; use Time::localtime; no strict 'refs'; my $pkg = 'Time::localtime'; my %syms; for my $name ( keys %{$pkg . '::'} ) { for my $type ( qw(SCALAR ARRAY HASH) ) { my $val = *{ "${pkg}::$name" }{ $type }; # val is a reference next unless defined $val; if (ref $val eq 'SCALAR') { next unless defined $$val; } elsif (ref $val eq 'ARRAY') { next unless @$val; } elsif (ref $val eq 'HASH') { next unless scalar %$val; } $syms{$type}{$name} = $val; } } print Dumper \%syms; Produces: $VAR1 = { 'ARRAY' => { 'ISA' => [ 'Exporter', 'Time::tm' ], 'EXPORT' => [ 'localtime', 'ctime' ], 'EXPORT_OK' => [ '$tm_sec', '$tm_min', '$tm_hour', '$tm_mday', '$tm_mon', '$tm_year', '$tm_wday', '$tm_yday', '$tm_isdst' ] }, 'SCALAR' => { 'VERSION' => \'1.01' }, 'HASH' => { 'EXPORT_TAGS' => { 'FIELDS' => [ '$tm_sec', '$tm_min', '$tm_hour', '$tm_mday', '$tm_mon', '$tm_year', '$tm_wday', '$tm_yday', '$tm_isdst', 'localtime', 'ctime' ] } } }; -- Chris Nandor [EMAIL PROTECTED]http://pudge.net/ Open Source Development Network[EMAIL P
Re: [Boston.pm] getting values out of symbol tables
Hi ( 03.01.17 13:56 -0500 ) Dan Sugalski: > Typeglobs are all that's in symbol tables. You need to look in the > globs if you want to get values. But how do I do this? Do I open () them? Do I dereference them? I've been digging through the camel book [and writing test scripts] without success. Any pointers or suggestions welcome. -- .--- ... ___ Boston-pm mailing list [EMAIL PROTECTED] http://mail.pm.org/mailman/listinfo/boston-pm
Re: [Boston.pm] getting values out of symbol tables
On Fri, 2003-01-17 at 13:45, John Saylor wrote: > I have a project where I am trying to dump all the variable names and > values in a given package namespace. I can get all the variable names > OK, it's just getting the values from those names that I am not able to > do. Check out the Dumpvalue module. :) -- Jeremy ___ Boston-pm mailing list [EMAIL PROTECTED] http://mail.pm.org/mailman/listinfo/boston-pm
Re: [Boston.pm] getting values out of symbol tables
On Fri, 2003-01-17 at 13:45, John Saylor wrote: > Hi > > I have a project where I am trying to dump all the variable names and > values in a given package namespace. I can get all the variable names > OK, it's just getting the values from those names that I am not able to > do. > > I have some code like this: > foreach $key ( keys %main::Package:: ) { > $val = $WW::Package::{$key}; > print "$key\t$val\n"; > } > > but all I get is typeglobs. > > Any help is appreciated. Dereference the typeglob: foreach $key ( keys %main::Package:: ) { my $scalar = $$main::Package::{$key}; my $arrayref = \@$main::Package::{$key}; my $hashref = \%$main::Package::{$key}; } -- John West Software Consultant, Perl Monk Corporate Technologies, Inc. 781-791-2118 signature.asc Description: This is a digitally signed message part
Re: [Boston.pm] getting values out of symbol tables
At 1:45 PM -0500 1/17/03, John Saylor wrote: Hi I have a project where I am trying to dump all the variable names and values in a given package namespace. I can get all the variable names OK, it's just getting the values from those names that I am not able to do. I have some code like this: foreach $key ( keys %main::Package:: ) { $val = $WW::Package::{$key}; print "$key\t$val\n"; } but all I get is typeglobs. Typeglobs are all that's in symbol tables. You need to look in the globs if you want to get values. -- Dan --"it's like this"--- Dan Sugalski even samurai [EMAIL PROTECTED] have teddy bears and even teddy bears get drunk ___ Boston-pm mailing list [EMAIL PROTECTED] http://mail.pm.org/mailman/listinfo/boston-pm
[Boston.pm] getting values out of symbol tables
Hi I have a project where I am trying to dump all the variable names and values in a given package namespace. I can get all the variable names OK, it's just getting the values from those names that I am not able to do. I have some code like this: foreach $key ( keys %main::Package:: ) { $val = $WW::Package::{$key}; print "$key\t$val\n"; } but all I get is typeglobs. Any help is appreciated. -- .--- ... ___ Boston-pm mailing list [EMAIL PROTECTED] http://mail.pm.org/mailman/listinfo/boston-pm