Perl有三種內置變量類型:
標量代表一個單一的值如下:
my $animal = "camel"; my $answer = 42;
在這裡my是一個已在同一節中解釋的關鍵字。
一個標值可以是字符串,整數或浮點數,Perl會自動轉換為它們需要的,但冇有必要預先聲明的變量類型。標值可以用各種方式:
print $animal; print "The animal is $animal\n"; print "The square of $answer is ", $answer * $answer, "\n";
看上去像標點符號或線路噪聲的名稱是“神奇”的標量。這些特殊的變量被用於各種目的,他們將討論在特殊的變量部分。隻有一個,你要知道現在大約是$_這是“默認變量”。它作為Perl函數的默認參數,它設置一些循環結構隱.
print; # prints contents of $_ by default
數組表示的值的列表:
my @animals = ("camel", "llama", "owl"); my @numbers = (23, 42, 69); my @mixed = ("camel", 42, 1.23);
數組是從零開始的索引,但你可以改變這個設置,改變默認變量$[$ ARRAY_BASE。這裡是你如何獲得元素在數組:
print $animals[0]; # prints "camel" print $animals[1]; # prints "llama"
特殊變量$#數組告訴你數組的最後一個元素的索引:
print $mixed[$#mixed]; # last element, prints 1.23
你可能會使用$#array+1,告訴你一個數組中有多少個項目。不要打擾。由於它發生時,使用@array,而Perl期望找到一個標量值(“標量上下文”)會給你在數組中的元素數量:
if (@animals < 5) { ... } # Here @animals will return 3
我們正在數組的從$起始,因為我們得到的隻是一個單一的值數組 - 你要求一個標量元素,你會得到一個標量.
若要獲取一個數組的多個值:
@animals[0,1]; # gives ("camel", "llama"); @animals[0..2]; # gives ("camel", "llama", "owl"); @animals[1..$#animals]; # gives all except the first element
這被稱為“數組切片”。你可以做各種有用的東西,列表如下:
my @sorted = sort @animals; my @backwards = reverse @numbers; # Here sort and reverse are Perl's built-in functions
有幾個特殊陣列,如@ ARGV中(腳本的命令行參數)和@_(參數)傳遞給子程序。這些都記錄在下一節“特殊變量”.
哈希代表一組鍵/值對。 事實上哈希數組類型的哈希索引可以是一個數字或字符串的異常。他們的前綴%符號如下:
my %fruit_color = ("apple", "red", "banana", "yellow");
您可以使用空格和=>運算符,奠定了更很好的:
my %fruit_color = ( apple => "red", banana => "yellow", );
為了得到一個哈希的元素:
$fruit_color{"apple"}; # gives "red"
鍵的鍵和值的列表,你可以get()和values()內置函數.
my @fruits = keys %fruit_colors; my @colors = values %fruit_colors;
哈希值有冇有什麼特彆的內部秩序,但你可以通過它們進行排序鍵和循環。就像特殊的標量和數組,也有特殊的哈希。這些是%ENV其中包含環境變量.
可以構建更複雜的數據類型,使用引用,它允許你建立名單,並在列表和哈希散列。引用是一個標值,可以參考任何其他的Perl數據類型。因此,存儲數組或哈希元素的值作為參考,你可以很容易地創建列表和哈希內的列表和哈希.
下麵的例子顯示一個哈希結構的2級哈希使用匿名散列引用.
my $variables = { scalar => { description => "single item", sigil => '$', }, array => { description => "ordered list of items - www.gitbook.net", sigil => '@', }, hash => { description => "key/value pairs", sigil => '%', }, };
下麵一行將打印 $
print "$variables->{'scalar'}->{'sigil'}\n" ;
Perl根據不同語境相同的變量。例如
my @animals = ("camel", "llama", "owl");
在這裡,@animals是一個數組,但它是在標量上下文中使用時,然後返回元素接觸的數量.
if (@animals < 5) { ... } # Here @animals will return 3
另一個例子:
my $number = 30;
這裡$number是標量和它包含的數量,但是當它被稱為字符串然後它成為數為0,字符串代替,:
$result = "This is " + "$number"; print "$result";
這裡將輸出30
在Perl中,我們使用反斜杠(\)字符來轉義任何類型的字符,可能會乾擾我們的代碼。下麵是例子
$result = "This is " . "\"number\""; print "$result";
這裡輸出將是這是“number”
變量名是大小寫敏感的$foo, $FOO和$fOo都是單獨.
整個上一節中所有的例子中,使用下麵的語法:
my $var = "value";
其實我是不需要的,你可以隻使用:
$var = "value";
然而,上述用法將創建全局變量在整個程序中,這是不好的編程習慣。但my創建詞法作用域的變量。變量的作用域在定義它們的塊(即一串由大括號包圍的語句)。有一個看看下麵的例子:
my $a = "foo"; if ($some_condition) { my $b = "bar"; print $a; # prints "foo" print $b; # prints "bar" by www.gitbook.net # } print $a; # prints "foo" print $b; # prints nothing; $b has fallen out of scope
結合使用my嚴格變量;在你的Perl腳本的頂部,意味著解釋將拿起一些常見的編程錯誤。例如,在上麵的例子,最後打印$b的會導致一個編譯時錯誤和防止運行程序。強烈建議使用嚴格。以下是使用:
use strict; my $a = "foo"; if ($some_condition) { my $b = "bar"; print $a; # prints "foo" print $b; # prints "bar" } print $a; # prints "foo " by www.gitbook.net print $b; # prints nothing; $b has fallen out of scope
我的運算符宣布列出的變量被詞法不外乎以下但不限於:
Enclosing blocks,
Conditional (if/unless/elsif/else)
Loop (for/foreach/while/until/continue)
Subroutine
eval or do/require/use'd file
如果列出了多個值,列表必須放在括號中。列出的所有元素都必須是合法的左值。當前必須與當地的本地化,而不是像$/作用域 - 魔法的內置插件.
my $foo; # declare $foo lexically local my (@wid, %get); # declare list of variables local my $foo = "flurp"; # declare $foo lexical, and init it my @oof = @bar; # declare @oof lexical, and init it my $x : Foo = $y; # similar, with an attribute applied
控製結構的詞法作用域範圍內精確地劃定控製塊由括號控製表達式是該範圍內的一部分. 因此,在循環$line範圍延伸整個循環結構(包括繼續條款)的其餘部分從它的聲明,但不超過.
while (my $line = <>) { $line = lc $line; }continue { print $line; }
同樣,在有條件$answer的範圍延伸,有條件的其餘部分通過其聲明,包括任何的elseif語句及其他子句,但不超過
if ((my $answer = <STDIN>) =~ /^yes$/i) { user_agrees(); } elsif ($answer =~ /^no$/i) { user_disagrees(); } else { chomp $answer; die "'$answer' is neither 'yes' nor 'no'"; }
我們鼓勵使用詞法作用域的變量。使用以下行,在你的程序文件的頂部,以避免任何錯誤。這會提醒你的變量範圍使用local 或my 關鍵字.
use strict 'vars';
本地修改其上市的變量是“local”封閉塊,eval,或做文件 - 從該區塊內調用的任何子程序。一個地方,隻是給全局意義包變量的臨時值。它不創建一個局部變量。這被稱為動態範圍.
詞法作用域是my,這更像C語言的自動聲明工作.
local $foo; # make $foo dynamically local local (@wid, %get); # make list of variables local local $foo = "flurp"; # make $foo dynamic, and init it local @oof = @bar; # make @oof dynamic, and init it
因為當地是一個運行時間的運算符,它通過一個循環,每次被執行。因此,它是更有效的本地化外循環的變量。
如果你定位一個特殊的變量,你給它一個新的價值,但它的魔法不會消失。這意味著,所有有關這種神奇的副作用仍然使用本地化值。此功能允許像這樣的代碼工作:
# Read the whole contents of FILE in $slurp { local $/ = undef; $slurp = <FILE> ; }