Arrays 如果已经有变量“$a”和“$b”,如何使用Perl`sort`和`pairwise``

Arrays 如果已经有变量“$a”和“$b”,如何使用Perl`sort`和`pairwise``,arrays,perl,scope,Arrays,Perl,Scope,我想编写一个Perl子例程,如下所示: use List::MoreUtils qw{pairwise}; sub multiply { my ($a, $b) = @_; return [ pairwise {$a * $b} @$a, @$b ]; } 乘法只是一个例子,我要做点别的 然而,这给了我一些毫无意义的结果,因为Perl会感到困惑,并试图使用外部$a和$b而不是列表项 如果我在REPL(如reply)中尝试此代码: 0>使用列表::MoreUtils qw{pai

我想编写一个Perl子例程,如下所示:

use List::MoreUtils qw{pairwise};
sub multiply {
    my ($a, $b) = @_;
    return [ pairwise {$a * $b} @$a, @$b ];
}
乘法只是一个例子,我要做点别的

然而,这给了我一些毫无意义的结果,因为Perl会感到困惑,并试图使用外部$a和$b而不是列表项

如果我在REPL(如reply)中尝试此代码:

0>使用列表::MoreUtils qw{pairwise}; 1> 我的$a=[1,2,3]; … 2> 我的$b=[3,2,1]; … 3> 成对{$a*$b}@$a、@$b; 无法在应答输入行1的成对代码块中使用词法$a或$b。 4> 排序{$a$b}@$a; my$a用于回复输入行1的排序比较。 my$b用于回复输入行1的排序比较。 $res[2]=[ 1. 3. 2. ] 到目前为止,我的解决方案一直在替换我的$a、$b=@;用我的$a,$b=@;i、 e.重命名麻烦的变量

还有其他解决方案吗?

首先-$a是一个糟糕的变量名。你为什么这么做?单字母几乎总是一个不好的选择,如果它只是一个迭代器或其他一些简单的用法,也差不多可以

因此,解决办法是“不要叫他们$a和$b”

我是说,如果你真的不想使用其他名称:

sub multiply {
   return [ pairwise { $a * $b } @{$_[0]}, @{$_[1]} ];
}
但您所做的是真正强调了为什么名称空间冲突是一个坏主意,因此在代码中使用$a和$b作为实际变量是自找麻烦的

我不认为有任何方法可以让它以你所尝试的方式工作,即使你可以-你最终会得到一些真正令人困惑的代码

我的意思是,像这样的东西应该有用:

因为这样你就显式地使用了$a和$b包,而不是词法包。但是请注意,如果它们是从另一个包中导入的,则不会以同样的方式工作,而且通常会变得很混乱

但它相当肮脏。直接告诉你不应该这样做:

一美元

b美元

使用sort时的特殊包变量,请参阅sort。由于这种特殊性,$a和$b不需要使用use vars声明,甚至在使用严格的“vars”pragma时也不需要声明。如果希望能够在排序比较块或函数中使用它们,请不要使用my$a或my$b对它们进行词汇化

那是在你进入“单字母变量名几乎总是一个坏主意”的领域之前

真的。是:

my ( $first, $second ) = @_;
实际上很糟糕吗?

首先-$a是一个糟糕的变量名。你为什么这么做?单字母几乎总是一个不好的选择,如果它只是一个迭代器或其他一些简单的用法,也差不多可以

因此,解决办法是“不要叫他们$a和$b”

我是说,如果你真的不想使用其他名称:

sub multiply {
   return [ pairwise { $a * $b } @{$_[0]}, @{$_[1]} ];
}
但您所做的是真正强调了为什么名称空间冲突是一个坏主意,因此在代码中使用$a和$b作为实际变量是自找麻烦的

我不认为有任何方法可以让它以你所尝试的方式工作,即使你可以-你最终会得到一些真正令人困惑的代码

我的意思是,像这样的东西应该有用:

因为这样你就显式地使用了$a和$b包,而不是词法包。但是请注意,如果它们是从另一个包中导入的,则不会以同样的方式工作,而且通常会变得很混乱

但它相当肮脏。直接告诉你不应该这样做:

一美元

b美元

使用sort时的特殊包变量,请参阅sort。由于这种特殊性,$a和$b不需要使用use vars声明,甚至在使用严格的“vars”pragma时也不需要声明。如果希望能够在排序比较块或函数中使用它们,请不要使用my$a或my$b对它们进行词汇化

那是在你进入“单字母变量名几乎总是一个坏主意”的领域之前

真的。是:

my ( $first, $second ) = @_;
实际上很糟糕吗?

成对设置调用者包中的$a和$b,因此可以使用完全限定的变量名

假设此代码位于包main中

或者,我们创建一个与当前包的变量同名的别名为的词法变量,它将覆盖my声明,因为最新的词法变量声明获胜

use List::MoreUtils qw{pairwise};
sub multiply {
    my ($a, $b) = @_;
    return [ pairwise { our $a * our $b } @$a, @$b ];
}
第二种方法显然比第一种方法脆弱得多,但你知道什么更不脆弱吗?首先不要将$a和$b声明为词法变量!:使用不同的变量会简单得多。甚至$A和$B或$x和$y都会更好。

成对设置调用者包中的$A和$B,因此可以使用完全限定的变量名

假设此代码位于包main中

或者,我们创建一个与当前包的变量同名的别名为的词法变量,它将覆盖my声明,因为最新的词法变量声明获胜

use List::MoreUtils qw{pairwise};
sub multiply {
    my ($a, $b) = @_;
    return [ pairwise { our $a * our $b } @$a, @$b ];
}
第二种方法显然比第一种方法脆弱得多,但你知道什么会 你会变得更不脆弱吗?首先不要将$a和$b声明为词法变量!:使用不同的变量会简单得多。甚至$A和$B或$x和$y都会更好。

不要首先调用变量$A和$B,它们是糟糕的变量名?不要首先调用变量$A和$B,它们是糟糕的变量名?$A不像$那样是超级全局变量,所以$::A只有在调用pairwise时才起作用。测试:perl-MData::Dumper-we'package-Pkg;使用数据::转储程序;使用列表::MoreUtils qw{pairwise};子乘法{my$a,$b=@;返回[pairwise{$::a*$::b}$$a,@$b];}printDumpermultiply[2,3,4],[4,3,2];'$a不像$\那样是超全局的,所以$::a只有在main中调用pairwise时才起作用。测试:perl-MData::Dumper-we'package-Pkg;使用数据::转储程序;使用列表::MoreUtils qw{pairwise};子乘法{my$a,$b=@;返回[pairwise{$::a*$::b}$$a,@$b];}printDumpermultiply[2,3,4],[4,3,2];'