给定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) 我刚刚开始学习领带.我有一个名为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 …
我经常发现能够在离开当前范围时安排执行代码很有用.在我以前的TCL生活中,一位朋友创建了一个名为defer的函数.
它启用了代码:set fp [open"x"] defer("close $ fp");
当前范围退出时调用的.主要的好处是无论我如何/在何处留下范围,它总是被调用.
所以我在Perl中实现了类似的东西,但似乎有一种更简单的方法.评论批评欢迎.
我在Perl中的方式:
实际代码如下.
有一个更好的方法吗?似乎这将是一项常用的功能.
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) 我试图按照跟踪变量用法的顺序绑定哈希(或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)
相同的代码使用普通哈希.
在第二种情况下我也需要这个工作,代码库是巨大的,我不想改变它,或怀疑某些地方某些东西在某些特定情况下不起作用.
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) perl5140delta说本地化的绑定变量没有长期束缚.此更改在5.13.1中实现,但在5.13.2中还原.这是回到5.14(从我的测试看起来似乎不是)或5.14.0的增量是不正确的?
我关心,因为我相信这会破坏File::chdir
我经常使用的.
我可以多次绑定一个变量吗?我自己尝试一下,但我不确定语法.我想将一个哈希绑定到Cache :: Memcached :: Tie 和 IPC :: Shareable.
Tie::
CPAN 上有很多带命名空间的模块- Tie :: Hash,Tie :: Sub,Tie :: Cache,Tie :: DBI等.它们之间有什么共同之处?
我检查了perltie但是我不确定我是否理解这个概念.有人可以解释一下吗?
我有一个哈希,例如$hash->{'foo'}{'bar'}
.
我想Carp::cluck
在bar
密钥值发生变化的任何地方打电话.
怎么做 ?在CPAN上有没有可以做到这一点的现成模块?
我打算编写一个简单的文本查看器,我希望能够处理非常大的文件.我正在考虑使用Tie::File
这个,并对线条进行分页.这是懒惰加载线条,还是一次加载所有线条?