2014-06-07 183 views
0

最終編輯:爲清楚起見,我正在對此問題進行最後一次編輯。我相信已經在所有評論中得到了答覆,但是如果有這樣的選擇,我認爲最好爲未來的讀者清理這個問題。Perl聲明範圍的變量聲明中的效率

我最近繼承了某人的Perl代碼,並且有一個有趣的設置,我想知道它是否可以變得更高效。

該程序設置爲使用strictwarnings(因爲它應該)。該程序設置爲使用global變量;這意味着變量被聲明並初始化爲程序頂部的undef。然後將特定值超出最初的undef然後分配給程序內各個循環中的變量。它們設置完成後,會有一個單獨的報告部分(在所有內部循環和子例程運行之後)爲其內容使用變量。

有相當多的變量,它似乎重複只是在程序的頂部做一個初始變量聲明,以便稍後用於輸出/報告的目的(並保持符合嚴格的編譯指示)。根據我的理解和迄今爲止收到的所有意見,似乎這是做到這一點的唯一方法,因爲根據定義,詞彙範圍變量只在其聲明的範圍內持續存在。所以,爲了使它global它需要提前聲明(即在頂部)。

我只是想知道是否有一個快捷方式將變量的範圍提升爲全局變量,無論它在哪裏聲明,並仍然保持在strict's參數當然?

我以前的例子是混亂的,所以我會在這裏寫的僞代碼示例要傳達的概念(我沒有與我原來的源):

# Initial declaration to create "Global variables" -- imagine about 30 or so 
my ($var1, $var2, $var3); # Global 

# Imagine a foreach loop going through a hash and assigning values 
# to previously declared variables 
for my $k (keys %h){ 
    ... 
    $var = 1; #$var gets set to 1 within the foreach loop 
    ... 
} 
print "The final calculated report is as follows:\n"; 

#output $var after loop is done later in program 
print "Variable 1 comes to $var1\n"; 

所以問題:有一個可接受的快捷方式,在foreach循環中聲明$var1並將其範圍升級超出foreach循環,因此它實際上是「Global」?這將避免需要在程序的頂部聲明並初始化爲undef,並仍然使其可用於程序的輸出中。

根據已收到的反饋,由於定義的範圍約束,答案似乎是一個強調的「否」。

+0

你的問題是什麼? – TLP

+0

是@secJ,它是更好的編碼風格,可以將變量限制在最小範圍內。你有時會看到你從C程序員描述的風格來到perl。另外,應該總是給變量名稱自動記錄代碼。 '$ var'沒有任何通信。但是,這聽起來不像是你有一個可以回答的直接問題,所以無論你應該重新設計還是我們應該把它視爲太寬泛。 – Miller

+0

嗯,不要擔心變量聲明*的效率*。 – ysth

回答

2

根據你自己的問題:

所以問題:有沒有聲明$ VAR1 foreach循環上述範圍內,並升級其範圍超出了foreach循環可接受的快捷方式,所以它實際上是「全球「?這將避免需要在程序的頂部聲明並初始化爲undef,並仍然使其可用於程序的輸出。

你可以參考變量名,而不必宣佈它首先用全名,包括命名空間:

use strict; 
use warnings; 

my %h = (
    first => 'value 1', 
    second => 'value 2', 
    third => 'value 3', 
); 

for my $k (keys %h) { 
    print "Processing key $k...\n"; 
    $main::var = 1; 
} 

print "Variable var is now $main::var\n"; 

我假設main爲您的命名空間,這是默認的。如果您的腳本聲明瞭package,那麼您需要使用該名稱。另外,如果您沒有首先聲明變量,則每次都需要使用整個package :: name格式。

然而,僅僅如此很明顯:你並不需要「聲明和初始化變量,以民主基金」。如果你這樣做:

my ($var1, $var2, $var3); 

這些變量已經初始化爲undef

現在,您還需要了解詞法和全局變量之間的區別。使用關鍵字my在腳本的頂部聲明變量將使其在腳本的所有其餘部分都可用,無論您是在塊內還是在塊外。但它們並不是全球性的,因爲它們對任何外部模塊或腳本都是不可見的。如果您將關鍵字my更改爲our,那麼它們是全局的,並且在該腳本之外的任何地方都可見。

+0

謝謝你的反應。 @ikegami提到了使用默認的'package',但我不知道這些變量是如何在Perl中訪問/設置的,所以直到現在我還不確定這是否正確。這正是我想要了解的。感謝您的闡述和解釋。 – secJ

1

我只是想知道是否有一個快捷方式將變量的範圍提升爲全局的,而不管它在哪裏聲明,並且仍然保持嚴格的參數?

使用全局變量是愚蠢的,但可能的。

use vars qw($foo); 

在任何用途之前,它仍然需要存在。

+0

來清理你之前提到的默認'package'是我想問的問題關於。感謝您的努力和幫助。 – secJ