私はPerlの=に過負荷をかけることはできますか? (タイを使用しながら問題)
-
18-09-2019 - |
質問
私はタイを使用し、これを見つけることを選択します:
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
に基づいてだけで何かます。
私は、セクション&キーの順序を維持したいので、私は順序を保存するために余分な配列を使用します。
私は「$Config->{newsection} = { this => 'that' }; # Add a section
」を使用する場合、しかし、私は「newsection」と「これ」は配列にプッシュすることができるように、「=
」をオーバーロードする必要があります。
影響を受け、他の部品なしで「$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{']'}}) {
}}
解決
これはまさにJUST演算子のオーバーロードはありませんが、あなたは絶対にこの機能が必要な場合、あなたはperlのネクタイを試すことができます。 http://perldoc.perl.org/functions/tie.htmlする
他のヒント
「=」、三つの引数を持つ関数への参照である値、すなわち、それが使用過多の他の値のように見えます。しかし、それはPerlの代入演算子をオーバーロードしません。これは、ラクダの毛に反するます。
だから、あなたはおそらく、あなたのアプローチを再考する必要があります。
あなたはコンフィグ:: IniFilesについて知っていますか?あなたがオフに行くと、それを改革する前にあなたはそれを考えるかもしれません。いくつかの適切なサブクラスで、あなたはそれに順序を追加することができます。
また、私はあなたが間違ったインターフェースを持っていると思います。あなたは、オブジェクトの内部構造を露出させ、魔法の割り当てを通してそれを修正しています。メソッドを使用すると、あなたの人生ははるかに容易になるだろう。