هل يمكنني التحميل الزائد بيرل =؟ (ومشكلة أثناء استخدام التعادل)

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

سؤال

اخترت استخدام التعادل والعثور على هذا:

package Galaxy::IO::INI;
sub new {
    my $invocant = shift;
    my $class = ref($invocant) || $invocant;
    my $self = {']' => []}; # ini section can never be ']'
    tie %{$self},'INIHash';
    return bless $self, $class;
}

package INIHash;
use Carp;
require Tie::Hash;

@INIHash::ISA = qw(Tie::StdHash);

sub STORE {
    #$_[0]->{$_[1]} = $_[2];
    push @{$_[0]->{']'}},$_[1] unless exists $_[0]->{$_[1]};
    for (keys %{$_[2]}) {
        next if $_ eq '=';
        push @{$_[0]->{$_[1]}->{'='}},$_ unless exists $_[0]->{$_[1]}->{$_};
        $_[0]->{$_[1]}->{$_}=$_[2]->{$_};
    }
    $_[0]->{$_[1]}->{'='};
}

إذا قمت بإزالة آخر "$[0]->{$1]} -> {'='}؛ "، لا يعمل بشكل صحيح. لماذا ا؟

أعرف أن قيمة الإرجاع مطلوبة. ولكن "$[0]->{$1]}؛ "لا يمكن أن تعمل بشكل صحيح أيضا، و $[0]->{$1]} -> {'='} ليس كل شيء.


المشاركة القديمة:

أنا أكتب حزمة في بيرل لتحليل ملفات INI. مجرد شيء بناء على Config::Tiny.

أريد الاحتفاظ بترتيب الأقسام والمفاتيح، لذلك يمكنني استخدام صفيف إضافي لتخزين الطلب.

ولكن عندما أستخدم " $Config->{newsection} = { this => 'that' }; # Add a section "، أحتاج إلى الزائد"="بحيث" الأخبار "و" هذا "يمكن دفعها في الصفيف.

هل هذا ممكن لجعل "$Config->{newsection} = { this => 'that' };"العمل دون التأثير على أجزاء أخرى؟

جزء من التعليمات البرمجية هو:

sub new {
    my $invocant = shift;
    my $class = ref($invocant) || $invocant;
    my $self = {']' => []}; # ini section can never be ']'
    return bless $self, $class;
}
sub read_string {
    if ( /^\s*\[\s*(.+?)\s*\]\s*$/ ) {
        $self->{$ns = $1} ||= {'=' => []};  # ini key can never be '='
        push @{$$self{']'}},$ns;
        next;
    }
    if ( /^\s*([^=]+?)\s*=\s*(.*?)\s*$/ ) {
        push @{$$self{$ns}{'='}},$1 unless defined $$self{$ns}{$1};
        $self->{$ns}->{$1} = $2;
        next;
    }
}
sub write_string {
    my $self = shift;
    my $contents = '';
    foreach my $section (@{$$self{']'}}) {
}}
هل كانت مفيدة؟

المحلول

ليس هذا مجرد التحميل الزائد للمشغل فقط، ولكن إذا كنت بحاجة تماما إلى هذه الوظيفة، فيمكنك تجربة ربطة عنق PERL:http://perldoc.perl.org/functions/tie.html.

نصائح أخرى

رموز خاصة للتحميل الزائد يسرد سلوك التحميل الزائد ل Perl "=".

القيمة الخاصة ب "=" هي إشارة إلى وظيفة مع ثلاث حجج، أي أنها تبدو وكأنها القيم الأخرى في استخدام التحميل الزائد. ومع ذلك، فإنه لا يزيد عن تحميل مشغل تعيين بيرل. هذا سوف يذهب ضد شعر الجمل.

لذلك ربما ستتحتاج إلى إعادة التفكير في نهجك.

هل تعرف عن التكوين :: inifiles.ب قد تفكر في ذلك قبل أن تنفجر وإعادة اختراعه. مع بعض الفئات الفئة الفرعية المناسبة، يمكنك إضافة الطلب إليها.

أيضا، أعتقد أن لديك واجهة خاطئة. أنت تعريض الهيكل الداخلي لكائنك وتعديله من خلال المهام السحرية. باستخدام الطرق من شأنه أن يجعل حياتك أسهل بكثير.

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