我可以重载 Perl 的 = 吗? (以及使用 Tie 时的问题)

发布于 2024-08-05 10:32:44 字数 2031 浏览 5 评论 0原文

我选择使用领带并发现:

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]}->{'='} 并不是全部。


Old post:

我正在用 Perl 编写一个包来解析 INI 文件。 只是基于 Config::Tiny 的东西。

我想保持部分和部分的顺序键,所以我使用额外的数组来存储顺序。

但是当我使用“ $Config->{newsection} = { this => 'that' }; # Add a section ”时,我需要重载 '= ' 这样“newsection”和“this”就可以被推入数组中。

这是否可以使“$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{']'}}) {
}}

I choose to use tie and find this:

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]}->{'='};
}

if I remove the last "$[0]->{$[1]}->{'='};", it does not work correctly.
Why ?

I know a return value is required. But "$[0]->{$[1]};" cannot work correctly either, and $[0]->{$[1]}->{'='} is not the whole thing.


Old post:

I am write a package in Perl for parsing INI files.
Just something based on Config::Tiny.

I want to keep the order of sections & keys, so I use extra array to store the order.

But when I use " $Config->{newsection} = { this => 'that' }; # Add a section ", I need to overload '=' so that "newsection" and "this" can be pushed in the array.

Is this possible to make "$Config->{newsection} = { this => 'that' };" work without influence other parts ?

Part of the code is:

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{']'}}) {
}}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

粉红×色少女 2024-08-12 10:32:44

重载的特殊符号
列出 Perl 重载“=”的行为。

“=”的值是对具有三个参数的函数的引用,即,它看起来像使用重载中的其他值。但是,它不会重载 Perl 赋值运算符。这与骆驼毛不相容。

因此,您可能需要重新考虑您的方法。

Special Symbols for Overload
lists the behaviour of Perl overloading for '='.

The value for "=" is a reference to a function with three arguments, i.e., it looks like the other values in use overload. However, it does not overload the Perl assignment operator. This would go against Camel hair.

So you will probably need to rethink your approach.

悲喜皆因你 2024-08-12 10:32:44

这并不完全是运算符重载,但如果您绝对需要此功能,您可以尝试 perl tie:
http://perldoc.perl.org/functions/tie.html

This is not exactly JUST operator overloading, but if you absolutely need this functionality, you can try a perl tie:
http://perldoc.perl.org/functions/tie.html

守护在此方 2024-08-12 10:32:44

您了解 Config::IniFiles 吗?在你开始重新发明它之前,你可能会考虑这一点。通过一些适当的子类化,您可以为其添加排序。

另外,我认为你的接口错误。您正在暴露对象的内部结构并通过神奇的赋值来修改它。使用方法会让你的生活变得更加轻松。

Do you know about Config::IniFiles? You might consider that before you go off and reinvent it. With some proper subclassing, you can add ordering to it.

Also, I think you have the wrong interface. You're exposing the internal structure of your object and modifying it through magical assignments. Using methods would make your life much easier.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文