这不是重要的问题,我知道,buuut $var = $_;
看起来只是跛脚,是否有更好(更短)的方式来完成这项任务?
为了澄清我的问题:我知道我可以很容易地使用代码$_
(这就是为什么我喜欢它),但有时我需要存储$_
,并做一些对$_
,然后回来旧值的$_
(例如) 。
这不是重要的问题,我知道,buuut $var = $_;
看起来只是跛脚,是否有更好(更短)的方式来完成这项任务?
为了澄清我的问题:我知道我可以很容易地使用代码$_
(这就是为什么我喜欢它),但有时我需要存储$_
,并做一些对$_
,然后回来旧值的$_
(例如) 。
按照第二次业绩请求,我发布我的评论作为答案。
它看起来像你问是否有更好或更短的方式来编写$var = $_
(或获得该功能)。对我来说,这是一个相当奇怪的要求,因为:
$var = $_
已经约短,因为它得到,并所有好的答案。 @awm说,我想再提供一个与“仅使用$_
”有关的例子。
11分钟前我刚写这几行:
sub composite
{
foreach my $element (@_)
{
# do something ...
}
}
sub simple
{
&composite($_[ int rand @_ ]);
}
这是一个Perl的高尔夫(cit.),不建议在所有使用。
如果您需要在其他地方存储$_
,并在一段时间后使用它的原始值,您应该执行分配。
使用local
:
$_ = 1;
{
local $_ = 2;
say; # prints 2
}
say; # prints 1
在一个新的词汇范围,你可以本地化$ _,这将防止影响其该范围以外的值范围内的任何修改。
一个例子是必要的澄清:
$_ = 1;
say;
{ # open a new scope
local $_ = 3;
$_++;
say;
} # close the scope
say;
这应该打印
1
4
1
我觉得它非常宝贵的写入功能,其广泛使用的$ _内部,因为我不喜欢当他们在他们周围的范围内闯入$ _时。但是,您也可以使用它来“搁置”一个变量并在一段时间内使用它的新版本。
可以使用map
通过将现有阵列生成一个新的数组:
my @squares = map { $_**2 } 1..10 ; # 1,4,9,16,25,36,49,64,81,100
my @after = map { process($_) } @before ; # @before unchanged, @after created
好像你想访问$_
局部值的下推堆栈。那可能很酷。不过,你可以自己做这样的东西。我可以告诉你基本知识。
our @A; # declare a stack
*::A = *A{ARRAY}; # "Globalize" it if necessary.
sub pd (&;@) # <- block operator prototype indicating language sugar
{
# I would have really preferred to do a push here.
local @A = (@A, $_);
# pull the block argument
my $block = shift;
# Ensure at least one execution
@_ = $_ unless @_;
# + Scalar behavior option #1
# return $block->(local $_ = shift) if not wantarray // 1;
# + Scalar behavior option #2
# unless (wantarray // 1) {
# my $result;
# while (@_) {
# local $_ = shift;
# return $result if defined($result = $block->($_));
# }
# return;
# }
# Standard filter logic
return map { $block->($_) } @_;
}
这里是基于这样的简单列表理解:
my @comp
= map { pd { pd { join '', @A[-2,-1], $_ } qw<g h> } qw<d e f>; } qw<a b c>
;
这里的@comp
:
@comp: [
'adg',
'adh',
'aeg',
'aeh',
'afg',
'afh',
'bdg',
'bdh',
'beg',
'beh',
'bfg',
'bfh',
'cdg',
'cdh',
'ceg',
'ceh',
'cfg',
'cfh'
]
也许通常称为apply
的功能是你在找什么。应用就好比map
但它使得它的参数构建一个备份:
apply {CODE} LIST
apply a function that modifies $_ to a shallow copy of LIST and returns the copy
print join ", " => apply {s/$/ one/} "this", "and that";
> this one, and that one
下面是从我的模块之一的实现:
所以,你想用你的数组/列表来计算一些东西,但不想修改它?只要先把表格复制一下,或者'使用Storable'clone';' – Zaid
“做些什么”比如说什么?如何在不使用任务的情况下存储它? – TLP
@TLP我的问题是_是否有更好(更短)的方式来完成这项任务?_我想存储它。我在询问**较短的**方法来分配'$ _'。 – korda