当我遇到一些我不理解的奇怪行为时,我正在愚弄一些混淆代码,这些代码没有做任何有用的事情.
这是我的代码.
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 &&呢?
我有一个问题,我希望你可以帮忙,因为我是哈希和哈希参考资料的新手?
我有以下数据结构:
$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) 可以像这样合并两个哈希:
%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数据结构:
$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'.
我有一个基于祝福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作为对象.
我正在努力实现甚至可能吗?
我正在尝试初始化一个包含多个表达式结果的 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)
然而,这对我来说似乎有点违反直觉。有人可以解释这种行为吗?
大脑在这一个上变得模糊.我想把我的骰子游戏从使用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和骰子类型之间的整数数组.
忽略如果一个人使用严格和警告可能不会发生的事实,我想知道为什么这两个案例不同.
#!/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时不会?
谢谢,
肖恩.
我有一个$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'方法
我有一个脚本,其代码如下所示.
$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)
我很感激任何关于可能导致此问题的更改的建议,以及修复脚本以在两个版本中正常工作的最佳方法.
我有一组预定义的哈希表,我想使用变量名称引用其中一个哈希并访问键值.即使填充了哈希,以下代码也会返回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) hashref ×11
perl ×11
hash ×6
arrays ×1
data-dumper ×1
function ×1
json ×1
linux ×1
loops ×1
obfuscation ×1
oop ×1
properties ×1
random ×1