2

私はネクタイを使用することを選択し、これを見つけます:

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 ファイルを解析するためのパッケージを Perl で作成しています。に基づいたものですConfig::Tiny

セクションとキーの順序を保持したいので、余分な配列を使用して順序を格納します。

しかし、" " を使用するときは、"newsection" と "this" を配列にプッシュできるように、$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{']'}}) {
}}
4

3 に答える 3

8

オーバーロードの特殊記号 に 、'=' に対する Perl のオーバーロードの動作がリストされています。

「=」の値は、3 つの引数を持つ関数への参照です。つまり、オーバーロードを使用する他の値のように見えます。ただし、Perl 代入演算子をオーバーロードしません。これはラクダの毛に反します。

したがって、おそらくアプローチを再考する必要があります。

于 2009-09-27T12:08:04.187 に答える
5

Config :: IniFilesについて知っていますか?出発して再発明する前に、それを検討するかもしれません。適切なサブクラス化を行うことで、それに順序を追加できます。

また、あなたは間違ったインターフェースを持っていると思います。オブジェクトの内部構造を公開し、魔法の割り当てによってオブジェクトを変更しています。メソッドを使用すると、あなたの生活がはるかに楽になります。

于 2009-09-27T20:49:29.473 に答える
5

これは正確には演算子のオーバーロードだけではありませんが、この機能が絶対に必要な場合は、perl のタイを試すことができます: http://perldoc.perl.org/functions/tie.html

于 2009-09-27T16:05:19.890 に答える