Arrays 如果已经有变量“$a”和“$b”,如何使用Perl`sort`和`pairwise``
我想编写一个Perl子例程,如下所示: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
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];'