2011-11-18 84 views
3

这不是重要的问题,我知道,buuut $var = $_;看起来只是跛脚,是否有更好(更短)的方式来完成这项任务?

为了澄清我的问题:我知道我可以很容易地使用代码$_(这就是为什么我喜欢它),但有时我需要存储$_,并做一些对$_,然后回来旧值的$_(例如) 。

+0

所以,你想用你的数组/列表来计算一些东西,但不想修改它?只要先把表格复制一下,或者'使用Storable'clone';' – Zaid

+0

“做些什么”比如说什么?如何在不使用任务的情况下存储它? – TLP

+0

@TLP我的问题是_是否有更好(更短)的方式来完成这项任务?_我想存储它。我在询问**较短的**方法来分配'$ _'。 – korda

回答

4

按照第二次业绩请求,我发布我的评论作为答案。

它看起来像你问是否有更好或更短的方式来编写$var = $_(或获得该功能)。对我来说,这是一个相当奇怪的要求,因为:

  • $var = $_已经约短,因为它得到,并
  • 有没有更好的办法让比使用相同 标志分配。
4

为什么要$var = $_?只需使用$_或将其作为参数传递给函数,函数称为$var

+0

我更新了我的问题。 – korda

+0

这个问题依然无效。将$ _传递给函数后,您不会收到该函数$ _返回,您保留原始$ _值。如果你想捕获返回的那个函数,然后把它放到另一个标量中。 – awm

+0

恐怕你错过了这里的观点。看看我接受的答案,它更好地阐明了它。 – korda

6

在许多情况下,这是不必要的。例如:

foreach my $var (@array) { 
    dostuff($var); 
} 

my $var; 
while ($var = <>) { 
    chomp($var); 
    dostuff($var); 
} 

while (<>) { 
    chomp; 
    dostuff($_); 
} 
+0

我知道 - 但说实话它并不回答我的问题。另外,如果我试图学习如何缩短代码,我已经知道那种东西;) – korda

+1

我想你会牺牲很多可读性来节省自己的几个击键。我知道它是perl,但在混淆竞赛之外有限制。 – mkb

3

所有好的答案。 @awm说,我想再提供一个与“仅使用$_”有关的例子。

11分钟前我刚写这几行:

sub composite 
{ 
    foreach my $element (@_) 
    { 
    # do something ... 
    } 
} 

sub simple 
{ 
    &composite($_[ int rand @_ ]); 
} 

这是一个Perl的高尔夫cit.),不建议在所有使用。

如果您需要在其他地方存储$_,并在一段时间后使用它的原始值,您应该执行分配。

+0

尝试一下[perlcritic](http://search.cpan.org/perldoc?perlcritic)对你的代码的评论。 – daxim

+0

@daxim我已经知道我会改变这种方式,顺便说一句,你让我好奇它会导致多少严重性:) – dave

+0

@daxim我认真的说,这不是那么糟糕...比我想象的要好,呵呵。 :P – dave

3

使用local

$_ = 1; 
{ 
    local $_ = 2; 
    say;   # prints 2 
} 
say;    # prints 1 
8

在一个新的词汇范围,你可以本地化$ _,这将防止影响其该范围以外的值范围内的任何修改。

一个例子是必要的澄清:

$_ = 1; 
say; 
{ # open a new scope 
    local $_ = 3; 
    $_++; 
    say; 
} # close the scope 
say; 

这应该打印

1 
4 
1 

我觉得它非常宝贵的写入功能,其广泛使用的$ _内部,因为我不喜欢当他们在他们周围的范围内闯入$ _时。但是,您也可以使用它来“搁置”一个变量并在一段时间内使用它的新版本。

+0

有趣......但我必须在我的情况下执行'local $ _ = $ _'。仍然不完美。 – korda

+0

如果我想将'$ _'的前一个值存储到'$ _'的新'local'版本中,我必须使用'local $ _ = $ _',或者有更简单的方法来做到这一点? – korda

+0

没有这是我害怕的唯一方法。 –

2

可以使用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 
1

好像你想访问$_局部值的下推堆栈。那可能很酷。不过,你可以自己做这样的东西。我可以告诉你基本知识。

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' 
     ] 
3

也许通常称为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 

下面是从我的模块之一的实现:

http://search.cpan.org/perldoc?List::Gen#apply

相关问题