كيف يمكنني إنشاء تجزئة المتداخلة كما ثابت في بيرل؟

StackOverflow https://stackoverflow.com/questions/1214541

سؤال

وأريد القيام به، في بيرل، أي ما يعادل رمز روبي التالية:

class Foo
  MY_CONST = {
    'foo' => 'bar',
    'baz' => {
      'innerbar' => 'bleh'
    },
  }

  def some_method
    a = MY_CONST[ 'foo' ]
  end

end

# In some other file which uses Foo...

b = Foo::MY_CONST[ 'baz' ][ 'innerbar' ]

وهذا هو، أريد فقط أن يعلن ثابت، هيكل تجزئة متداخلة للاستخدام سواء في الصف وخارجه. كيف؟

هل كانت مفيدة؟

المحلول

ويمكنك استخدام تجزئة :: UTIL وحدة لقفل وفتح تجزئة ( مفاتيح، والقيم، أو كليهما).

package Foo;
use Hash::Util;

our %MY_CONST = (
    foo => 'bar',
    baz => {
        innerbar => 'bleh',
    }
);

Hash::Util::lock_hash_recurse(%MY_CONST);

وبعد ذلك في بعض الملفات الأخرى:

use Foo;
my $b = $Foo::MY_CONST{baz}{innerbar};

نصائح أخرى

ويمكنك أيضا القيام بذلك تماما مع builtins:

package Foo;
use constant MY_CONST =>
{
    'foo' => 'bar',
    'baz' => {
        'innerbar' => 'bleh',
    },
};

sub some_method
{
    # presumably $a is defined somewhere else...
    # or perhaps you mean to dereference a parameter passed in?
    # in that case, use ${$_[0]} = MY_CONST->{foo} and call some_method(\$var);
    $a = MY_CONST->{foo};
}

package Main;  # or any other namespace that isn't Foo...
# ...
my $b = Foo->MY_CONST->{baz}{innerbar};

قراءة فقط :

#!/usr/bin/perl

package Foo;

use strict;
use warnings;

use Readonly;

Readonly::Hash our %h => (
    a => { b => 1 }
);

package main;

use strict;
use warnings;

print $Foo::h{a}->{b}, "\n";

$h{a}->{b} = 2;

وإخراج:

C:\Temp> t
1
Modification of a read-only value attempted at C:\Temp\t.pl line 21

وهنا هو دليل على التجزئة في بيرل. التجزئة من علامات الرقم

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top