2009-12-21 67 views
33

我也接觸過一些Perl模塊例如類似於下面的代碼:「1」是什麼在Perl中的意思是?

package MyPackage; 

use strict; 
use warnings; 
use constant PERL510 => ($] >= 5.0100); 

require Exporter; 

our @ISA = qw(Exporter); 
our @EXPORT = qw(); 

{ #What is the significance of this curly brace? 

    my $somevar; 

    sub Somesub { 
     #Some code here 
    } 
} 

1; 

什麼是1;和封閉$somevar和小組花括號的意義是什麼?

+2

另外,[爲什麼你必須把1放在perl5模塊的末尾?](http://stackoverflow.com/questions/3606528/why-do-you-have-to-put- a-1-per-5-module)和[Cool返回值](http://returnvalues.useperl.at/values.html)。 – Lazer 2010-10-07 06:29:26

+0

我很失望,tchrist沒有提交這個答案。 – 2011-06-09 03:02:56

+0

從技術上講,這是兩個問題之一。我通常會試着將它們扼殺在萌芽狀態,並在答案進入之前編輯一個問題,但現在已經太晚了。 – Flimm 2015-03-11 13:02:58

回答

65

1在模塊的端部指的模塊返回到trueuse/require語句。它可以用來判斷模塊初始化是否成功。否則,use/require將失敗。

$somevar是一個只能在塊內部訪問的變量。它用於模擬「靜態」變量。在Perl 5.10開始,你可以使用關鍵字state關鍵字擁有相同的結果:

## Starting from Perl 5.10 you can specify "static" variables directly. 
sub Somesub { 
    state $somevar; 
} 
+6

Upvote,因爲這個答案既簡潔又正確,實際上回答了父母的所有問題。 – daxim 2009-12-21 14:21:59

4

大括號限制了本地變量$ somevar範圍:

{ 我的$ somevar; ... }#$ somevar的範圍在這裏結束

8

模塊必須返回一個真正的值。 1是一個真正的價值。

1

我對Perl不太瞭解,但通常使用花括號來創建一個範圍。大概$ somevar不應該在全球範圍內可用?

11

當您使用use Foorequire()加載模塊「Foo」時,perl像普通腳本一樣執行Foo.pm文件。如果模塊加載正確,它希望它返回一個真正的值。 1;這樣做。它也可以是2;"hey there";

圍繞聲明$somevar的函數和函數Somesub限制變量的範圍。這樣,它只能從Somesub訪問,並且不會在每次調用Somesub時清除(如果它是在函數體內聲明的話)。這個習慣用法在最近版本的perl(5.10及更高版本)中被取代,它們的關鍵字是state

8

Perl模塊必須返回的東西,結果爲true。如果他們不這樣做,Perl會報告錯誤。

C:\temp>cat MyTest.pm 
package MyTest; 
use strict; 
sub test { print "test\n"; } 
#1; # commented out to show error 

C:\temp>perl -e "use MyTest" 
MyTest.pm did not return a true value at -e line 1. 
BEGIN failed--compilation aborted at -e line 1. 

C:\temp> 

儘管通常使用「1」,但任何評估爲true的東西都可以使用。

C:\temp>cat MyTest.pm 
package MyTest; 
use strict; 
sub test { print "test\n"; } 
"false"; 

C:\temp>perl -e "use MyTest" 

C:\temp> (no error here) 

對於obvious reasons另一種流行的返回值是。

http://returnvalues.useperl.at/values.html處有一個很酷的回報值列表。

4

require文件:

該文件必須作爲最後 語句返回true表示成功 執行任何初始化代碼, 所以這是習慣性地結束這樣的文件 1;除非你確定 否則返回true。但最好 只是把1; ,以防你添加 更多的陳述。