Perl初級教程 第2天

2021-03-31 08:57:00 字數 4388 閱讀 5121

陣列變數陣列變數是標量的集合。陣列變數與標量有相同的形式,除了其字首為@符號。下面的語句把三個元素賦給陣列變數@food,把兩個元素賦給陣列變數@music。

陣列通過以0開始的索引進行訪問,方括號內為索引值。表示式

$food[2]

返回的結果為ells。注意上式中為$,而不是@,因為其引用的是乙個標量。

陣列賦值

在perl中,相同的表示式在不同的上下文中會產生不同的結果。下面的第乙個賦值語句引用了@music變數,所以結果與第二個賦值語句相同。

這也是把元素加入陣列的一種方式。一種更簡潔的把元素加入陣列的方式是:

push(@food,"eggs");

push(@food, "eggs", "lard");

push(@food, ("eggs", "lard"));

push(@food, @morefood);

push函式返回新的列表的長度。

可以用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;

($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.

最後乙個賦值語句的發生是因為陣列是貪婪的,@somefood會吞掉@food中的任何值。因此應盡量避免這種方式。

最後,你可能想知道列表中最後乙個元素的索引值,可以用這個表示式:$#food。

列印陣列:

既然上下文很重要,就不要奇怪下面的表示式產生不同的結果:

print @food; # by itself

print "@food"; # embedded in double quotes

print @food.""; # in a scalar context

檔案處理

下面是乙個簡單的perl程式,與unix中cat命令對某個檔案的操作相同。

#!/usr/local/bin/perl

## 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

open函式開啟乙個檔案並進行讀操作。第乙個引數filehandle是指向檔案的控制代碼。第二個引數為被開啟的檔案的檔名。如果檔名以被引號包圍的形式給出,那麼它只被從字面意義上引用,而沒有shell解釋。

因此表示式'~/notes/todolist'不會被成功地翻譯。如果希望得到shell解釋,可以使用尖括號:即使用<~/notes/todolist>。

close函式告訴perl關閉被開啟的檔案。

open語句也可以對檔案進行輸出和附加操作。可以在檔名前加》進行輸出操作,用》進行附加操作:

open(info, $file);	# open for input

open(info, ">$file"); # open for output

open(info, "<$file"); # also open for input

如果想在乙個已經開啟的檔案中列印資訊,可以用帶引數的列印語句。把乙個字串列印到乙個用info控制代碼開啟的檔案中可以使用

print info "this line goes to the file./n";

可以用下面的語句開啟標準輸入(通常為鍵盤)和標準輸出(通常為螢幕):

open(info, '-');	# open standard input

open(info, '>-'); # open standard output

在上面的程式中從乙個檔案中讀取資訊。這個檔案是info,perl用尖括號對它進行讀操作。因此語句

@lines=;

把檔案中的所有資訊讀入陣列@lines中。如果用標量$lines,則唯讀第一行。在這兩種情況下,每行都以換行符結束。

控制結構

perl支援很多種與c類似的控制結構,但是也與pascal很相似。下面我們分別對著這些結構進行討論。

foreach

perl使用foreach結構對陣列或其它列表結構中的每行進行操作:

foreach $morsel (@food)		# visit each item in turn

# and call it $morsel

每次的操作過程被包圍在花括號內。程式塊中的$morsel第一次被賦予@food陣列中的第乙個值,然後被賦予陣列的第二個值,依次類推。如果@food是空的,那麼程式塊將不會被執行。

判斷判斷是檢驗表示式結果是真是假的一種結構。在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?

($a || $b) # is either $a or $b true?

!($a) # is $a false?

for

perl的for結構與c的類似:

for (initialise; test; inc)

語句initialise被首先執行,然後當test為真時程式塊被執行。程式塊每執行一次,inc發生一次。下面是乙個迴圈列印數字0到9的迴圈:

for ($i = 0; $i < 10; ++$i)	# start with $i = 1

# do it while $i < 10

# increment $i before repeating

while和until

下面是乙個從鍵盤讀輸入,知道口令正確為止的程式:

#!/usr/local/bin/perl

print "password? "; # ask for input

$a = ; # get input

chop $a; # remove the newline at end

while ($a ne "fred") # while input is wrong...

當鍵盤輸入與口令不同時花括號內的程式塊被執行。while結構很清晰,但有幾點要注意:第一,我們可以從標準輸入讀入資訊,而不用開啟檔案。第二,當口令被輸入時,$a被賦予包括換行符在結尾的值。chop函式刪除字串的最後乙個字元,這裡是換行符。

until也可以執行相同的工作。程式塊被反覆執行,直到表示式為真。

另一種方式是把while或until放在程式塊的後面。這要求do放在程式塊的開始處,而判斷在結尾處。這樣程式可以這樣寫:

#!/usr/local/bin/perl

dowhile ($a ne "fred") # redo while wrong input

perl初級教程[第1天]

<< >>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使用者認證 首先不管你做沒有做過許可權管理,如下圖你也是熟悉的。這個圖的流程很簡單,很直觀的看到許可權認證的流程走向。那麼上圖中...