标签: tie

如何在插入顺序中将哈希值提取到数组中?

给定Perl中的哈希值(任何哈希值),如何从该哈希值中提取它们的顺序,并将它们放入数组中?

例:

my %given = ( foo => '10', bar => '20', baz => '15' );
Run Code Online (Sandbox Code Playgroud)

我想得到以下结果:

my @givenValues = (10, 20, 15);
Run Code Online (Sandbox Code Playgroud)

perl hash tie

6
推荐指数
2
解决办法
1741
查看次数

如何在绑定变量上调用方法?

我刚刚开始学习领带.我有一个名为Link的类,我想做以下事情:

  • 如果已获取,则返回链接的地址
  • 如果存储,则存储新地址
  • 能够调用它上面的方法

到目前为止,我的代码是:


package Link;

sub FETCH {
    my $this = shift;
    return $this->{"site"};
}

sub STORE {
    my ($self,$site) = @_;
    $self->{"site"}   = $site;
}

sub print_method {
    my $self = shift;
    print $self->{"site"};
}

sub TIESCALAR {
    my $class = shift;
    my $link  = shift;
    my $this  = {};
    bless($this,$class);
    $this->{"site"} = $link;
    return $this;
}

1;
Run Code Online (Sandbox Code Playgroud)

我用来检查功能的代码是:


use Link;

tie my $var,"Link","http://somesite.com";
$var->print_method;
Run Code Online (Sandbox Code Playgroud)

运行时,脚本将以以下错误终止: 无法在tietest.pl第4行调用没有包或对象引用的方法"print_method".

如果我正确理解了它的消息,则$var->print_method …

perl object tie

5
推荐指数
2
解决办法
406
查看次数

推迟Perl中范围更改的代码

我经常发现能够在离开当前范围时安排执行代码很有用.在我以前的TCL生活中,一位朋友创建了一个名为defer的函数.

它启用了代码:set fp [open"x"] defer("close $ fp");

当前范围退出时调用的.主要的好处是无论我如何/在何处留下范围,它总是被调用.

所以我在Perl中实现了类似的东西,但似乎有一种更简单的方法.评论批评欢迎.

我在Perl中的方式:

  • 创建一个全局的绑定变量,该变量包含要执行的子数组.
  • 每当我想安排在退出时调用fn时,我使用local来更改数组.当我离开当前范围时,Perl将全局更改为先前的值,因为全局是绑定的,我知道何时发生此值更改并且可以调用列表中的subs.

实际代码如下.

有一个更好的方法吗?似乎这将是一项常用的功能.

use strict;

package tiescalar;

sub TIESCALAR {
    my $class = shift;

    my $self = {};
    bless $self, $class;
    return $self;
}

sub FETCH {
    my $self = shift;
    return $self->{VAL};
}

sub STORE {
    my $self = shift;
    my $value = shift;

    if (defined($self->{VAL}) && defined($value)) {
    foreach my $s (@{$self->{VAL}}) { &$s; }
    }
    $self->{VAL} = $value;
}

1;

package main;

our $h;
tie($h, 'tiescalar'); …
Run Code Online (Sandbox Code Playgroud)

perl scope tie

5
推荐指数
1
解决办法
479
查看次数

在请求一个arrayref时,perl中绑定哈希的奇怪行为

我试图按照跟踪变量用法的顺序绑定哈希(或hashref).

一切都适用于简单的情况,但当我尝试在一些真正的代码上使用我的模块时,我遇到了这个错误:

hash- or arrayref expected (not a simple scalar, use allow_nonref to allow this)
Run Code Online (Sandbox Code Playgroud)

我使用以下代码复制了错误:

use Tie::Hash::Usages;
use JSON;

my @arr = (
    {
        key1 => "ac",
        key2 => 12,
        key3 => 12
    },        
);
my %tied_hash;


tie %tied_hash, 'Tie::Hash::Usages';

$tied_hash{key1} = \@arr;

my @val = $tied_hash{key1};
print encode_json(\@val)."\n\n"; #this works

print encode_json($tied_hash{key1}); #this doesn't
Run Code Online (Sandbox Code Playgroud)

相同的代码使用普通哈希.

在第二种情况下我也需要这个工作,代码库是巨大的,我不想改变它,或怀疑某些地方某些东西在某些特定情况下不起作用.

Usages.pm(简体)

package Tie::Hash::Usages;
use strict;
use warnings;

use Tie::Hash;

use vars qw(@ISA);

@ISA = qw(Tie::StdHash);

sub TIEHASH {

    my ($class, $tracker, $filename) …
Run Code Online (Sandbox Code Playgroud)

perl tie

5
推荐指数
1
解决办法
574
查看次数

如何在perl脚本中绑定每个变量?

我希望在创建/访问/销毁perl脚本中的变量时看到每个地方

使用tie或可轻松到达Variable::Magic

但是如何在创建变量时自动应用此魔法?

perl tie

5
推荐指数
1
解决办法
171
查看次数

perl5140delta本地化绑定变量

perl5140delta说本地化的绑定变量没有长期束缚.此更改在5.13.1中实现,但在5.13.2中还原.这是回到5.14(从我的测试看起来似乎不是)或5.14.0的增量是不正确的?

我关心,因为我相信这会破坏File::chdir我经常使用的.

documentation perl tie

4
推荐指数
1
解决办法
54
查看次数

多次绑定变量

我可以多次绑定一个变量吗?我自己尝试一下,但我不确定语法.我想将一个哈希绑定到Cache :: Memcached :: Tie IPC :: Shareable.

perl tie

4
推荐指数
1
解决办法
221
查看次数

使用Tie :: namespace的perl模块的常见想法是什么?

Tie::CPAN 上有很多带命名空间的模块- Tie :: Hash,Tie :: Sub,Tie :: Cache,Tie :: DBI等.它们之间有什么共同之处?

我检查了perltie但是我不确定我是否理解这个概念.有人可以解释一下吗?

perl naming tie

4
推荐指数
1
解决办法
80
查看次数

如何查看特定的哈希键以更改其值?

我有一个哈希,例如$hash->{'foo'}{'bar'}.

我想Carp::cluckbar密钥值发生变化的任何地方打电话.

怎么做 ?在CPAN上有没有可以做到这一点的现成模块?

debugging perl tie

4
推荐指数
1
解决办法
106
查看次数

Tie :: File是否懒得加载文件?

我打算编写一个简单的文本查看器,我希望能够处理非常大的文件.我正在考虑使用Tie::File这个,并对线条进行分页.这是懒惰加载线条,还是一次加载所有线条?

arrays perl tie

3
推荐指数
2
解决办法
149
查看次数

标签 统计

perl ×10

tie ×10

arrays ×1

debugging ×1

documentation ×1

hash ×1

naming ×1

object ×1

scope ×1