我喜欢使用Perl从外部Perl脚本中捕获所有全局变量。目前我对类型检测很感兴趣。
如何确定正确的数据类型('','SCALAR','HASH','ARRAY','CODE')?
解析器脚本:
my %allVariables = ();
{
do "scriptToBeParsed.pl";
foreach my $sym ( keys %main:: ) {
# Get all normal variables and scalar/hash/array references:
if ( ref( *{"$sym"} ) =~ m/^(?:|SCALAR|HASH|ARRAY)$/ ) {
$allVariables{"$sym"} = *{"$sym"};
}
}
}
要解析的脚本:
$someVariable1 = 'Yes, I like to be captured';
$otherVariable2 = \'And I also want to be captured';
%anotherVariable3 = ( 'Capture' => 'me' );
@lameVariable4 = ( 'Capture', 'me' );
$fooVariable5 = { 'Capture' => 'me' };
$barVariable6 = [ 'Capture', 'me' ];
$subVariable7 = sub { return "Don't capture me!" };
sub dontCaptureMe { return "Don't capture me!" }
在我的例子中ref( *{"$sym"} )
总是返回'GLOB'(当然)。
答案 0 :(得分:3)
另一种方法是使用typeglob的has-like访问,这在第131页的brian d foy的 Mastering Perl 的第8章中有解释。
package test;
no strict;
no warnings;
$someVariable1 = 'Yes, I like to be captured';
$otherVariable2 = \'And I also want to be captured';
%anotherVariable3 = ( 'Capture' => 'me' );
@lameVariable4 = ( 'Capture', 'me' );
$fooVariable5 = { 'Capture' => 'me' };
$barVariable6 = [ 'Capture', 'me' ];
$subVariable7 = sub { return "Don't capture me!" };
sub dontCaptureMe { return "Don't capture me!" }
say $dontCaptureMe;
my %allVariables = ();
{
do "scriptToBecomeParsed.pl";
foreach my $sym ( keys %test:: ) {
for (qw( SCALAR HASH ARRAY CODE IO)) {
if (*{"$sym"}{$_}) {
$allVariables{$_}->{"$sym"} = *{"$sym"}{$_};
}
}
}
}
print Data::Dumper::Dumper \%allVariables;
这将产生以下输出:
$VAR1 = {
'CODE' => {
'dontCaptureMe' => sub { "DUMMY" }
},
'ARRAY' => {
'lameVariable4' => [
'Capture',
'me'
]
},
'HASH' => {
'anotherVariable3' => {
'Capture' => 'me'
}
},
'SCALAR' => {
'someVariable1' => \'Yes, I like to be captured',
'__ANON__' => \undef,
'subVariable7' => \sub { "DUMMY" },
'dontCaptureMe' => \undef,
'otherVariable2' => \\'And I also want to be captured',
'BEGIN' => \undef,
'barVariable6' => \[
'Capture',
'me'
],
'anotherVariable3' => \undef,
'lameVariable4' => \undef,
'fooVariable5' => \{
'Capture' => 'me'
}
}
};
答案 1 :(得分:1)
ref(* {“$ sym”})总是返回'GLOB'(当然)。
因为perl将符号表中的所有内容存储在glob中,所以无法确定哪些数据类型是什么。这是因为在perl中,拥有数组,标量,哈希或其他具有相同名称的其他内容是完全有效的...因此,perl将所有内容存储在globs中以避免冲突。你可以做的是循环遍历符号表中的所有符号,并针对它可能存在的所有可能事物测试每个glob(设置不是太大)并查看设置了哪些。
或者,更实际的方法可能是将perl脚本作为文本加载并解析$
,%
,@
,sub
,{{1} }(filehandle)查看一切类型是什么。