标签: hashref

Perl:从函数返回hashref不起作用

当我遇到一些我不理解的奇怪行为时,我正在愚弄一些混淆代码,这些代码没有做任何有用的事情.

这是我的代码.

no strict;
sub foo{1&&{${$_[0]},${$_[0]}}}say map {&${${_}}(${_})->{${${_}}}}map{\$_}qw(foo);
Run Code Online (Sandbox Code Playgroud)

并缩进:

no strict;
sub foo {
  1 && { ${$_[0]} => ${$_[0]} }
}
say map { &${ ${_} }( ${_} )->{ ${ ${_} } } }
  map { \$_ } qw (foo);
Run Code Online (Sandbox Code Playgroud)

它应该做的是获取字符串foo,构建对它的引用,然后使用该名称调用该函数(&foo).该函数应该返回一个hashref,其中key和value都是foo字符串.之后,它会打印返回的hashref键的值foo,即foo.

到现在为止还挺好.没用,但仍然很有趣.奇怪的是,当我删除1 &&子中的部分时,它会返回一个列表,尽管有curlies,我不知道为什么会这样做.

如果我只是说它sub foo { { 'foo'=>'foo' } }返回参考.为什么不在我的情况下呢?而且,当我添加时为什么1 &&呢?

obfuscation perl function hashref

2
推荐指数
1
解决办法
188
查看次数

Perl访问散列/散列引用数据结构中的元素

我有一个问题,我希望你可以帮忙,因为我是哈希和哈希参考资料的新手?

我有以下数据结构:

$VAR1 = {
    'http://www.superuser.com/' => {
        'difference' => {
            'http://www.superuser.com/questions' => '10735',
            'http://www.superuser.com/faq' => '13095'
        },
        'equal' => {
            'http://www.superuser.com/ ' => '20892'
        }
    },
    'http://www.stackoverflow.com/' => {
        'difference' => {
            'http://www.stackoverflow.com/faq' => '13015',
            'http://www.stackoverflow.com/questions' => '10506'
        },
        'equal' => {
            'http://www.stackoverflow.com/ ' => '33362'
        }
    }
Run Code Online (Sandbox Code Playgroud)

如果我想访问密钥中的所有URL,'difference'那么我可以对URL执行一些其他操作,访问这些元素的正确或首选方法是什么?

例如,我最终将得到以下URL,然后我可以在foreach循环中执行以下操作:

http://www.superuser.com/questions
http://www.superuser.com/faq
http://www.stackoverflow.com/faq
http://www.stackoverflow.com/questions
Run Code Online (Sandbox Code Playgroud)

- - - 编辑 - - -

用于访问上面显示的数据结构的元素的代码:

my @urls;
foreach my $key1 ( keys( %{$VAR1} ) ) {
    print( "$key1\n" …
Run Code Online (Sandbox Code Playgroud)

perl hash www-mechanize hash-of-hashes hashref

2
推荐指数
1
解决办法
5132
查看次数

Perl合并哈希

可以像这样合并两个哈希:

%one = {
    name    => 'a',
    address => 'b'
};

%two = {
    testval => 'hello',
    newval  => 'bye'        
};

$one{location} = %two;
Run Code Online (Sandbox Code Playgroud)

所以结束哈希看起来像这样:

%one = {
    name    => 'a',
    address => 'b',
    location => {
        testval => 'hello',
        newval  => 'bye'
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经看了一眼,但不确定这是否可以在没有for循环的情况下完成.谢谢 :)

perl hash hashref

2
推荐指数
1
解决办法
408
查看次数

Perl循环通过嵌套的祝福hashref元素

我有一个类似于以下的perl数据结构:

$VAR1 = bless( {
                 'admin' => '0',
                 'groups_list' => [
                                           bless( {
                                                    'name' => undef,
                                                    'groupid' => 'canedit',
                                                    'description' => 'Can Edit Articles'
                                                  }, 'group_entry' ),
                                           bless( {
                                                    'name' => undef,
                                                    'groupid' => 'webuser',
                                                    'description' => 'Can Access Content'
                                                  }, 'group_entry' ),
                                         ],
                 'trusted' => '1',
               }, 'user_info' );
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种方法来循环遍历'groups_list'中的所有组,并检查我们是否有'webuser'groupid.任何帮助表示赞赏.

另外,请告诉我是否可以在不使用循环的情况下完成此操作...例如搜索字符串'groupid'=>'webuser'.

perl loops hashref

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

如何停止或允许将perl对象用作hashref?

我有一个基于祝福hashref的Perl类(https://github.com/kylemhall/Koha/blob/master/Koha/Object.pm)

这是一个基于社区的项目,有许多不同技能的开发人员.

我看到的是一些开发人员不小心使用我们的对象作为hashrefs.实际数据不存储在祝福的hashref中,而是存储在hashref中的dbic对象中(在$ self - > {_ result}中).当开发人员尝试像$ object这样的东西时 - > {id} perl不会抱怨,它只会返回undef,正如预期的那样.

我想要做的是A)当发生这种情况时让脚本爆炸并出现错误B)允许使用hashref语法来设置/获取存储在$ self中的dbic对象中的值 - > {_ result}

我试过用:

use overload '%{}' => \&get_hashref;
Run Code Online (Sandbox Code Playgroud)

但是当我这样做时,每次调用常规方法时都会调用get_hashref!这在某种程度上是有道理的,因为对象本身是一个hashref.我确信这与Perl内部有关,可以将祝福的hashref作为对象.

我正在努力实现甚至可能吗?

oop perl hashref

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

Hashref 赋值消耗下一个键而不是赋值 undef

我正在尝试初始化一个包含多个表达式结果的 hashref。我希望返回未定义结果的表达式将 undef 分配给适当的键。相反,赋值只是吞噬了下一个键,就好像表达式从不存在一样。

一个简单的例子可能更容易理解:

use Data::Dumper;
my $str = "vs";
my $contains = {
    t => ($str =~ /t/i),
    u => ($str =~ /u/i),
    v => ($str =~ /v/i),
};
print(Data::Dumper->Dump([$contains]));
Run Code Online (Sandbox Code Playgroud)

我希望上面的代码打印:

$VAR1 = {
    'v' => 1,
    't' => undef,
    'u' => undef
};

Run Code Online (Sandbox Code Playgroud)

相反,我得到以下信息:

$VAR1 = {
    't' => 'u',
    'v' => 1
};

Run Code Online (Sandbox Code Playgroud)

在赋值中添加一个明确的 undef 确实让我得到了我正在寻找的结果:

$VAR1 = {
    'v' => 1,
    't' => undef,
    'u' => undef
};

Run Code Online (Sandbox Code Playgroud)

然而,这对我来说似乎有点违反直觉。有人可以解释这种行为吗?

perl hash variable-assignment hashref

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

如何从hashref中的数组中弹出?

大脑在这一个上变得模糊.我想把我的骰子游戏从使用rand()到使用来自random.org的随机值列表.我能够很好地检索这些值,我只是挂起了从列表中弹出的语法.

这是我的功能,让我适合:

sub roll_d
{
  return (pop($$dice_stack{@_[0]}));
  # Original code:
  #return (int(rand @_[0]) + 1);
}
Run Code Online (Sandbox Code Playgroud)

其中$ dice_stack是指向散列的指针,其中键是骰子类型(d6为'6',d20为'20'),值为1和骰子类型之间的整数数组.

arrays random perl hash hashref

0
推荐指数
1
解决办法
610
查看次数

Perl hashref/property confusion

忽略如果一个人使用严格和警告可能不会发生的事实,我想知道为什么这两个案例不同.

#!/usr/local/perl5/bin/perl

$x[0] = "";
$y[0] = "";

$x[0]->{name} = "SRV";
$y[0]->{name} = "FINAL";
print "$x[0]->{name}, $y[0]->{name}\n";

$x[1]->{name} = "SRV";
$y[1]->{name} = "FINAL";
print "$x[1]->{name}, $y[1]->{name}\n";
Run Code Online (Sandbox Code Playgroud)

输出是:

FINAL, FINAL
SRV, FINAL
Run Code Online (Sandbox Code Playgroud)

为什么,当索引为零时,y [0] - > {name}赋值是否影响x [0] - > {name},但是当索引为1时不会?

谢谢,

肖恩.

perl properties hashref

0
推荐指数
1
解决办法
92
查看次数

Access Data Dumper嵌套Perl Hash

我有一个$artifact使用Data :: Dumper打印的Perl哈希引用.

输出print Dumper ($artifact);返回以下内容.

$VAR1 = bless( {
             '_content' => '{
  "results" : [ {
"uri" : "http://localhost:port/myfile.tar"
   } ]
}',);
Run Code Online (Sandbox Code Playgroud)

但是,我在尝试专门访问URI的值时遇到问题,即我想检查是否uri有值.

谢谢!

编辑:只是一些背景.我正在使用Artifactory :: Client perl模块中的'artifact_search'方法

perl hash json hashref data-dumper

0
推荐指数
1
解决办法
906
查看次数

在使用"严格参考"时,不能使用字符串("6/16")作为HASH参考

我有一个脚本,其代码如下所示.

$shelf->print("\nStarted syncing from \"${%Family::MEMBERS}{$member}\" \n");
Run Code Online (Sandbox Code Playgroud)

当我尝试使用perl(v5.8.8)在CentOS 7.0上本地运行它时,它工作正常,但在相同的操作系统上使用perl(v5.16.3)的相同代码,它给出了我的错误.

Can't use string ("6/16") as a HASH ref while "strict refs" in use at
Run Code Online (Sandbox Code Playgroud)

我很感激任何关于可能导致此问题的更改的建议,以及修复脚本以在两个版本中正常工作的最佳方法.

linux perl hashref

0
推荐指数
1
解决办法
406
查看次数

如何使用变量名引用哈希?

我有一组预定义的哈希表,我想使用变量名称引用其中一个哈希并访问键值.即使填充了哈希,以下代码也会返回null.我在这里做错了什么,或者有更好的方法来实现这一目标?

my %TEXT1 = (1 => 'Hello World',);
my %TEXT2 = (1 => 'Hello Mars',);
my %TEXT3 = (1 => 'Hello Venus',);

my $hash_name = 'TEXT1';

my $hash_ref = \%$hash_name;
print ${$hash_ref}{1};  #prints nothing
Run Code Online (Sandbox Code Playgroud)

perl hash hashref

0
推荐指数
1
解决办法
71
查看次数