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
", 나는 과부하가 필요하다"=
"뉴스"와 "이"는 배열에서 밀 수 있습니다.
이것이 가능합니까 "$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 Tie를 시도 할 수 있습니다.http://perldoc.perl.org/functions/tie.html
다른 팁
과부하를위한 특수 기호 '='에 대한 Perl Overloading의 동작을 나열합니다.
"="의 값은 세 가지 인수가있는 함수에 대한 참조입니다. 그러나 Perl 할당 연산자에 과부하가 걸리지 않습니다. 이것은 낙타 머리카락에 맞서게 될 것입니다.
따라서 접근 방식을 다시 생각해야 할 것입니다.
당신은 알고 있습니까? config :: inifiles? 당신은 당신이 떠나기 전에 그것을 재발 명하기 전에 그것을 고려할 수 있습니다. 적절한 서브 클래싱을 사용하면 주문을 추가 할 수 있습니다.
또한, 나는 당신이 잘못된 인터페이스를 가지고 있다고 생각합니다. 객체의 내부 구조를 노출시키고 마법의 과제를 통해 수정합니다. 방법을 사용하면 인생이 훨씬 쉬워집니다.