陣列變數陣列變數是標量的集合。陣列變數與標量有相同的形式,除了其字首為@符號。下面的語句把三個元素賦給陣列變數@food,把兩個元素賦給陣列變數@music。
陣列通過以0開始的索引進行訪問,方括號內為索引值。表示式
$food[2]
返回的結果為ells。注意上式中為$,而不是@,因為其引用的是乙個標量。
陣列賦值
在perl中,相同的表示式在不同的上下文中會產生不同的結果。下面的第乙個賦值語句引用了@music變數,所以結果與第二個賦值語句相同。
這也是把元素加入陣列的一種方式。一種更簡潔的把元素加入陣列的方式是:
push(@food,"eggs");
push(@food, "eggs", "lard");push函式返回新的列表的長度。push(@food, ("eggs", "lard"));
push(@food, @morefood);
可以用pop函式移去乙個列表中的最後乙個元素,然後返回這個元素。在最初的列表中,pop函式返回eels,然後@food中有兩個元素:
$grub = pop(@food); # now $grub = "eels"
也可以把陣列賦給乙個標量。通常上下文是很重要的。$f=@food;得到@food的長度,但是$f="@food";把列表轉換成以空格隔開每個元素的字串。通過改變特殊變數$"的值可以把空格用其它任何字串代替。這個變數只是perl中很多特殊變數中的乙個,它們中的很多都有奇怪的名字。
陣列也可以用來為多個標量進行賦值:
($a, $b) = ($c, $d); # same as $a=$c; $b=$d;最後乙個賦值語句的發生是因為陣列是貪婪的,@somefood會吞掉@food中的任何值。因此應盡量避免這種方式。($a, $b) = @food; # $a and $b are the first two
# items of @food.
($a, @somefood) = @food; # $a is the first item of @food
# @somefood is a list of the
# others.
(@somefood, $a) = @food; # @somefood is @food and
# $a is undefined.
最後,你可能想知道列表中最後乙個元素的索引值,可以用這個表示式:$#food。
列印陣列:
既然上下文很重要,就不要奇怪下面的表示式產生不同的結果:
print @food; # by itself檔案處理print "@food"; # embedded in double quotes
print @food.""; # in a scalar context
下面是乙個簡單的perl程式,與unix中cat命令對某個檔案的操作相同。
#!/usr/local/bin/perlopen函式開啟乙個檔案並進行讀操作。第乙個引數filehandle是指向檔案的控制代碼。第二個引數為被開啟的檔案的檔名。如果檔名以被引號包圍的形式給出,那麼它只被從字面意義上引用,而沒有shell解釋。## program to open the password file, read it in,
# print it, and close it again.
$file = '/etc/passwd'; # name the file
open(info, $file); # open the file
@lines = ; # read it into an array
close(info); # close the file
print @lines; # print the array
因此表示式'~/notes/todolist'不會被成功地翻譯。如果希望得到shell解釋,可以使用尖括號:即使用<~/notes/todolist>。
close函式告訴perl關閉被開啟的檔案。
open語句也可以對檔案進行輸出和附加操作。可以在檔名前加》進行輸出操作,用》進行附加操作:
open(info, $file); # open for input如果想在乙個已經開啟的檔案中列印資訊,可以用帶引數的列印語句。把乙個字串列印到乙個用info控制代碼開啟的檔案中可以使用open(info, ">$file"); # open for output
open(info, "<$file"); # also open for input
print info "this line goes to the file./n";
可以用下面的語句開啟標準輸入(通常為鍵盤)和標準輸出(通常為螢幕):
open(info, '-'); # open standard input在上面的程式中從乙個檔案中讀取資訊。這個檔案是info,perl用尖括號對它進行讀操作。因此語句open(info, '>-'); # open standard output
@lines=;
把檔案中的所有資訊讀入陣列@lines中。如果用標量$lines,則唯讀第一行。在這兩種情況下,每行都以換行符結束。
控制結構
perl支援很多種與c類似的控制結構,但是也與pascal很相似。下面我們分別對著這些結構進行討論。
foreach
perl使用foreach結構對陣列或其它列表結構中的每行進行操作:
foreach $morsel (@food) # visit each item in turn每次的操作過程被包圍在花括號內。程式塊中的$morsel第一次被賦予@food陣列中的第乙個值,然後被賦予陣列的第二個值,依次類推。如果@food是空的,那麼程式塊將不會被執行。# and call it $morsel
判斷判斷是檢驗表示式結果是真是假的一種結構。在perl中,任何非0數字和非空字串被看作真。數字0、0字串和空字串被看作假。下面是一些基於數字和字串的判斷:
$a == $b # is $a numerically equal to $b?也可以用邏輯與、或、非:# beware: don't use the = operator.
$a != $b # is $a numerically unequal to $b?
$a eq $b # is $a string-equal to $b?
$a ne $b # is $a string-unequal to $b?
($a && $b) # is $a and $b true?for($a || $b) # is either $a or $b true?
!($a) # is $a false?
perl的for結構與c的類似:
for (initialise; test; inc)語句initialise被首先執行,然後當test為真時程式塊被執行。程式塊每執行一次,inc發生一次。下面是乙個迴圈列印數字0到9的迴圈:
for ($i = 0; $i < 10; ++$i) # start with $i = 1while和until# do it while $i < 10
# increment $i before repeating
下面是乙個從鍵盤讀輸入,知道口令正確為止的程式:
#!/usr/local/bin/perl當鍵盤輸入與口令不同時花括號內的程式塊被執行。while結構很清晰,但有幾點要注意:第一,我們可以從標準輸入讀入資訊,而不用開啟檔案。第二,當口令被輸入時,$a被賦予包括換行符在結尾的值。chop函式刪除字串的最後乙個字元,這裡是換行符。print "password? "; # ask for input
$a = ; # get input
chop $a; # remove the newline at end
while ($a ne "fred") # while input is wrong...
until也可以執行相同的工作。程式塊被反覆執行,直到表示式為真。
另一種方式是把while或until放在程式塊的後面。這要求do放在程式塊的開始處,而判斷在結尾處。這樣程式可以這樣寫:
#!/usr/local/bin/perlperl初級教程[第1天]dowhile ($a ne "fred") # redo while wrong input
<< >>perl初級教程[第3天]
HLSL初級教程
hlsl 初級教程 trcj 目錄 前言1.hlsl 入門1.1 什麼是著色器 1.2什麼是 hlsl 1.3怎麼寫hlsl 著色器1.4 怎麼用hlsl 著色器2.頂點著色器 2.1可程式設計資料流模型 2.2頂點宣告 2.3用頂點著色器實現漸變動畫 3.畫素著色器 3.1多紋理化 3.2多紋理效...
SubVersion初級教程
don t tell me why,just tell me how.1 找個rpm或者bin或者tar之類的安裝包,把subvesion安裝好。裝好之後client server admin都在你機器上了。2 首先在你中意的目錄,比如根目錄 下,執行 svnadmin create svnroot...
shiro 初級教程
首先 看不懂多看幾次,我已經把我學習的精華寫出來了 什麼許可權管理,我認為大概包括使用者認證與使用者授權。只要用使用者的系統,都會存在許可權管理。二 許可權管理基礎 2.1使用者認證 首先不管你做沒有做過許可權管理,如下圖你也是熟悉的。這個圖的流程很簡單,很直觀的看到許可權認證的流程走向。那麼上圖中...