我想编写一个子程序(比如说s2r
),它可以将SCALAR输入(一个有效的字符串化引用)转换为REF类型。作为奖励,如果输入是相应的字符串化版本,我希望子例程将输入转换为原始祝福对象(或绑定引用)。我的计划是将此子例程用作调试实用程序(例如,查看哪些引用可能被意外存储为哈希键)。
我的初始原型(失败)是这样的:
#!/usr/bin/env perl
use strict;
use warnings;
use Scalar::Util qw(reftype);
sub bad_s2r {
my $thing = shift or return undef;
return eval {
no strict 'refs';
$thing =~ /^HASH\b/ ? \%$thing : $thing =~ /^ARRAY\b/ ? \@$thing : \$$thing
};
}
my $ref = [];
my $str = "$ref";
print $ref, "\n";
print bad_s2r($str), "\n";
我得到了这个输出:
ARRAY(0x7fde1a0070d0)
ARRAY(0x7fde1a007310)
我非常怀疑我正在引用原始数组的副本。
有没有办法将标量视为参考,可能使用Perl编译器后端B
或其他模块,或者可能遍历程序中存在的所有可能的引用,并将输入与其字符串化值进行比较?我不介意它是否效率低,只要它是可能的。
如果不能做这样的事情,有什么理由不这样吗?