【问题标题】:Can I overload Perl's =? (And a problem while use Tie)我可以重载 Perl 的 = 吗? (使用 Tie 时出现问题)
【发布时间】:2009-09-27 11:45:22
【问题描述】:

我选择使用 tie 发现这个:

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


旧帖:

我正在用 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{']'}}) {
}}

【问题讨论】:

  • 可以(并且可能对未来的读者更有帮助)将此作为两个单独的问题发布。

标签: perl oop package overloading tie


【解决方案1】:

Special Symbols for Overload 列出了 '=' 的 Perl 重载行为。

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

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

【讨论】:

  • 所以,这就是为什么我没有在重载 '=' 上找到任何东西。
【解决方案2】:

这不仅仅是运算符重载,但如果你绝对需要这个功能,你可以试试 perl tie: http://perldoc.perl.org/functions/tie.html

【讨论】:

    【解决方案3】:

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

    另外,我认为你的界面有误。您正在暴露对象的内部结构并通过神奇的分配对其进行修改。使用方法会让你的生活更轻松。

    【讨论】:

    • 我看到了 Config::IniFiles,它似乎比 Config::Tiny 大一点。由于要在其他电脑上使用,所以我觉得写一个新的单个文件 pm 比复制几个文件到一个新的路径要容易。
    • 嗯,使用 cpan 工具安装模块并不难。无论如何,您不应该复制。不过,这是一个不同的问题。
    猜你喜欢
    • 2013-12-05
    • 1970-01-01
    • 2013-06-18
    • 2014-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    • 2011-10-25
    相关资源
    最近更新 更多