Perl序列化对字符串的嵌套引用

时间:2015-12-19 19:56:38

标签: perl

我正在寻找使用复杂键(任意引用)作为哈希键的解决方案,除了它们对键执行深度比较而不是参考比较。

我正在寻找一个函数,最好是在一个核心模块中,它将任意引用(可能不包括子程序和类型地块引用)序列化为字符串,以便以后可以重构它们。

double h (double x)
{
  if ( x == 0.0 ) return 1e99; // infinite
  double k;
  k = 1.0 + (1.0/x) + (1.0 /pow (x,2));
  return k;
}

1 个答案:

答案 0 :(得分:5)

没有必要将所有数据序列化只是为了拥有(可能是巨大的)哈希键。而是采用数据结构的校验和并将其用于密钥。将原始密钥存储为值的一部分。

以下是使用perl5i to do the deep checksum的示例。

sub get {
    my $self = shift;
    my $key  = shift;

    return $self->{$key->mo->checksum}{value};
}

sub set {
    my $self = shift;
    my($key, $val) = @_;

    $self->{$key->mo->checksum} = $val;

    return;
}

sub each {
    my $self = shift;
    my $code = shift;

    my $val;
    while( (undef, $val) = each %$self ) {
        $code->($val->{key}, $val->{value});
    }

    return;
}

$obj->set(\@stuff, "value");
my $value = $obj->get(\@stuff);

$obj->each( func($key, $val) {
    say "$key -> $val\n";
}

你可以将它包装在一个小类中,以使它更方便。

<?php
abstract class BasePresenter extends Nette\Application\UI\Presenter
{
    public function beforeRender()
    {
        $locale = 'en';

        // register filters
        $this->template->addFilter('myFilter', function ($s) use ($locale) {
            // don't forget to set your own magic
            return someMagic($s, $locale);
        });
    }
}
?>