gpt4 book ai didi

perl - 为什么 perl 解析 $x | $y | $z 作为 $z | ($x | $y)?

转载 作者:行者123 更新时间:2023-12-04 15:01:50 26 4
gpt4 key购买 nike

(编辑:下面的 pipe 函数应该返回一个受祝福的对象,以便重载正常工作。请参阅已接受的答案。)

我正在尝试使用 perl 的 overload建立一个简单的分析树的能力。
我不需要太多 - 事实上,我只需要一个左关联的运算符。
但是 perl 解析 $x op $y 的方式似乎不一致与更长的
链状$x op $y op $z op ... .

这是我所拥有的:

package foo;

use overload '|' => \&pipe,
"**" => \&pipe,
">>" => \&pipe;

sub pipe { [ $_[0], $_[1] ] }

package main;

my $x = bless ["x"], "foo";
my $y = bless ["y"], "foo";
my $z = bless ["z"], "foo";
my $w = bless ["w"], "foo";

# how perl parses it:
my $p2 = $x | $y; # Cons x y
my $p3 = $x | $y | $z; # Cons z (Cons x y)
my $p4 = $x | $y | $z | $w; # Cons w (Cons z (Cons x y))
my $p5 = $z | ($x | $y); # same as p3???

my $s2 = $x ** $y; # Cons x y
my $s3 = $x ** $y ** $z; # Cons x (Cons y z)
my $s4 = $x ** $y ** $z ** $w; # Cons x (Cons y (Cons z w))

sub d { Dumper(\@_) }

say "p2 = ".d($p2);
say "p3 = ".d($p3);
say "p4 = ".d($p4);
say "p5 = ".d($p5);

say "s2 = ".d($s2);
say "s3 = ".d($s3);
say "s4 = ".d($s4);

输出类似于:
p2 = [bless( ['x'], 'foo' ),bless( ['y'], 'foo' )]
p3 = [bless( ['z'], 'foo' ),[bless( ['x'], 'foo' ),bless( ['y'], 'foo' )]]
p4 = [bless( ['w'], 'foo' ),[bless( ['z'], 'foo' ),[bless( ['x'], 'foo' ),bless( ['y'], 'foo' )]]]
p5 = [bless( ['z'], 'foo' ),[bless( ['x'], 'foo' ),bless( ['y'], 'foo' )]]

s2 = [bless( ['x'], 'foo' ),bless( ['y'], 'foo' )]
s3 = [bless( ['x'], 'foo' ),[bless( ['y'], 'foo' ),bless( ['z'], 'foo' )]]
s4 = [bless( ['x'], 'foo' ),[bless( ['y'], 'foo' ),[bless( ['z'], 'foo' ),bless( ['w'], 'foo' )]]]

不应该 p2 x 和 y 是否反转以与其他情况一致?
请注意 p3p5产生相同的输出 - 那么我如何区分它们?

我没有看到右结合运算符 ** 的相同问题.

有解决办法吗?

最佳答案

use feature ":5.14";
use warnings FATAL => qw(all);
use strict;
use Data::Dump qw(dump pp);

sub foo()
{package foo;

use overload '|' => \&p;

sub p {bless [@{$_[0]},@{$_[1]}]}
}

my $x = bless ["x"], "foo";
my $y = bless ["y"], "foo";
my $z = bless ["z"], "foo";

my $p = $x | $y | $z;

pp($p)

产生:
bless(["x", "y", "z"], "foo")

关于perl - 为什么 perl 解析 $x | $y | $z 作为 $z | ($x | $y)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12293640/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com