2011-11-18 82 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

相關問題