【问题标题】:Making Perl's "specific declarations" as variable将 Perl 的“特定声明”作为变量
【发布时间】:2017-03-29 23:01:39
【问题描述】:

如果可能的话,如果以下设置可以解释为变量的正式声明,我正在寻找某种解决方案。 我所拥有的是:

my $str_1 = "{cow}" ;

my $str_2 = "{cow}{black}{tasty_milk}";

我想要的是:

(基于上面的变量字符串是否可以直接初始化哈希, 类似:)

my %hash=();

$hash."*some operator* on $str_i"  = 'Initialized' ;

这个“一些运算符”应该使 $hash 能够识别为之前声明的哈希值。即输入特定的哈希初始化。

PS:我不想编写一个函数来处理字符串并获取所有信息来初始化哈希。

【问题讨论】:

标签: perl variables hash


【解决方案1】:

假设您有以下输入:

my @path = qw( cow black tasty_milk );

然后你可以使用以下内容:

use Data::Diver qw( DiveVal );

DiveVal(\%hash, map \$_, @path) = 'value';

所以,使用Data::Diver,我们得到:

use Data::Diver qw( DiveVal );

$str =~ /^(?:\{\w+\})+\z/
   or die("Unrecognized format");

my @path = $str =~ /(\w+)/g;
DiveVal(\%hash, map \$_, @path) = 'value';

没有模块:

sub dive_val :lvalue { my $p = \shift;  $p = \( $$p->{$_} ) for @_;  $$p }

$str =~ /^(?:\{\w+\})+\z/
   or die("Unrecognized format");

my @path = $str =~ /(\w+)/g;
dive_val(\%hash, @path) = 'value';

【讨论】:

  • @reinierpost,它验证输入,解析输入,然后设置哈希元素。这怎么不明显?
  • 很明显,它试图做这样的事情,但是问题没有明确说明,而且你的代码非常简洁,没有任何 cmets,我很难理解发生了什么,最重要的是为什么,我是一个从事 Perl 代码工作 20 年的人。
  • 是哪一个?它的作用是显而易见的,还是你很难理解它的作用?
  • 它的作用并不明显,也不明显它是jordan vj想要的。
  • @reinierpost,你大错特错了。很明显,导致die("Unrecognized format") 的检查会检查输入是否采用可识别的格式。我不敢相信我必须告诉你,如果你以前(用任何语言)编程过。
【解决方案2】:

使用匿名哈希尝试以下操作

use Data::Dumper;
use warnings; 
use strict;

my $str_2 = "{cow}{black}{tasty_milk}";
my %hash;
my $ref =\%hash;
my $val;
my $lp = () = $str_2=~m/\}/g; #count the number of }
my $i = 1;
while($str_2=~m/\{(\w+)\}/g)
{
    $val = $1;

    last if ($lp == $i); 

    $ref->{$val} = {}; #make the anonymous hash        

    $ref = $ref->{$val};   #add the data into anonymous hash

    $i++;

}
$ref->{$val} = "value"; #add the last value

print Dumper \%hash;

【讨论】:

  • 顺便说一下,my $ref =\%hash; my $val; my $lp = () = $str_2=~m/\}/g; my $i = 1; while($str_2=~m/\{(\w+)\}/g) { $val = $1; last if ($lp == $i); $ref->{$val} = {}; $ref = $ref->{$val}; $i++; } $ref->{$val} = "value"; 简化为my $p = \\%hash; $p = \( $$p->{$1} ) while $str_2 =~ /\{(\w+)\}/g; $$p = "value";
  • @ikegami 非常了不起。我试图知道你的把戏,但我不能请你解释一下。? :)
  • 诀窍是添加一个间接层。更多关于 herehere
猜你喜欢
  • 2020-11-22
  • 2012-12-21
  • 1970-01-01
  • 2013-05-28
  • 2015-09-04
  • 2012-02-13
  • 1970-01-01
  • 2013-07-11
  • 2015-10-10
相关资源
最近更新 更多