語言基本要素 - 朝陽科技大學

文章推薦指數: 80 %
投票人數:10人

這個perl 也有, 而且語法和C 一模一樣: for (初始設定; 應該繼續; 準備下一步) { . ... sum 5 18 2 7 9 於是perl 會自動將用你程式的人所敲進去的 命令列參數command ... Perl語言 新手上路 基本要素 餵資料 常用句型 regexp 詳談變數 一語中的 副程式 模組 外界對話 附錄 參考資料 scripting Windows 圖形介面 big-5碼 light dark 我的部落格: 人權 玩具 快速跳到: 社群活動 本層目錄 上層目錄 此頁@朝陽 此頁@資管 English 語言基本要素 加法範例程式 #數字版#for迴圈版(自找麻煩版) print"13+5=",13+5,"\n";usestrict; my(@x,$sum,$i); #純量變數版@x=(13,5,1,7); $x=13;$sum=0; $y=5;for($i=0;$i<=$#x;++$i){ print$x+$y,"\n";$sum+=$x[$i]; } #變數宣告版print$sum,"\n"; usestrict; my($x,$y);#好用版:數字從命令列參數讀入 $x=13;print$ARGV[0]+$ARGV[1],"\n"; $y=5; print$x+$y,"\n";#實用版:讀命令列上所有的參數 usestrict; #陣列版my($sum,$t); usestrict;$sum=0; my(@x,$sum,$t);foreach$t(@ARGV){ @x=(13,5,1,7);$sum+=$t; $sum=0;} foreach$t(@x){print"$sum\n"; $sum+=$t; } print"$sum\n"; 簡單的加法程式 剛開始學一種語言,請自己用手照著打一遍。

(嘿嘿嘿, 上面程式的排版方式,就是故意不讓讀者輕易剪貼... 除非您會用vim的visual blockmode。

)如果出現錯誤訊息, 不要只是把程式改對就算了,更一定要注意看 錯誤訊息說什麼。

這樣以後遇到相同的錯誤訊息, 你才能很快地想起來是不是少打了分號還是變數前面忘記加錢號。

數字版心得: 從"#"開始,一直到該列結束,都是註解。

放在雙引號裡面的是字串,會原封不動地印出來。

print後面可以接一串東西,用逗點分開。

如果你自己沒有在字串頭尾加空格,印出來的結果就會黏在一起。

print 不會自動幫你加空格。

每句話都以分號結尾。

純量變數版與變數宣告版心得: 在perl裡面,變數前面都要加錢號。

這種簡單的變數叫做 純量變數scalarvariable。

原本perl允許你直接使用變數,不必宣告。

不過良藥苦口利於病, 忠言逆耳利於行--與其等到執行的時候才錯得不明不白, 還不如在直譯時就多聽perl嘮叨一些, 至少它印的錯誤訊息會告訴你第幾行出錯("...at你的程式檔名line 6") 加上usestrict;之後,perl 就會要求使用變數之前必須宣告。

用my(...);宣告變數。

陣列版心得: 以小老鼠開頭的變數是陣列變數arrayvariable。

注意它設定初始值的方法與print後面放的東西類似-- 都是一串東西用逗點分開。

只不過外面必須多一對括弧。

(其實print 後面那一串東西,外面多包一對括弧一樣也可以。

) 如果你心裡想的是"我要把陣列@x裡面的每個元素$e都拿來..." 那就直接翻譯成foreach$e(@x){...處理$e...} 這樣迴圈每執行一次,@x裡面的每個元素就會輪流變身成為$e 讓你在迴圈裡面處理。

$sum+=$t其實就是$sum=$sum+ $t 其實雙引號字串"..."裡面的東西,並非完全原封不動地印出。

例如 "\n"會印換列;而字串裡面如果有純量變數,則會把變數的值代換進去。

請試試看將print後面的字串改為單引號字串'...'看會怎麼樣。

自找麻煩版心得:熟悉C的同學可能比較習慣用for迴圈。

這個perl 也有,而且語法和C一模一樣:for(初始設定;應該繼續; 準備下一步){...}效果相當於: 初始設定; while(應該繼續){ ... 準備下一步; } 但如果要這樣寫,你就必須知道迴圈要做幾次。

陣列@x的元素個數是 $#x+1也就是說,$#x是陣列@x最後一個元素的註標(因為perl與c 一樣,從第0個元素開始數起。

) 結論是:可以很自然使用foreach的場合,就不要自找麻煩使用for。

foreach比較簡潔,又更能夠口語化地直接反應出我們心中想的邏輯。

寫程式之前先將你想做的事用中文說出來,如果你聽到自己喃喃唸著 "把陣列當中的每個元素抓出來...",那麼就可以直接翻譯成foreach 語法。

正因為perl程式念起來很像英文(畢竟發明人LarryWall 是語言學家嘛),也就很可以想像為什麼網路上有人 拿perl 作詩,甚至舉辦 perl 寫詩比賽。

當然,for迴圈的彈性比foreach彈性大,有些場合就是很難套用 foreach,例如f-f乘法表就用for 比較自然。

而foreach能做的事,也都必然可以用for做得到: 在簡單的情況下(也就是說,嚴格說起來以下並不正確),如果你只從@all 讀資料出來,而不去修改它的內容,則foreach$var(@all){... }的效果相當於: for($i=0;$i<=$#all;++$i){ $var=$all[$i]; ... } 好用版與實用版心得:你自己寫的perl程式也可以像系統命令一樣帥, 可以從命令列上讀參數進去,像這樣:./sum518279於是 perl會自動將用你程式的人所敲進去的命令列參數commandline argument放入@ARGV陣列(注意大小寫!在perl 裡面大小寫有分別!),你從程式裡面就可以抓出來處理。

這個陣列是內建的, 不必宣告就可以用。

計算log的近似值 下面這個程式計算log的近似值,例如./log128會印7, 而./log4096會印12。

它內定以2為底; 不過如果命令列上出現第二個參數,就改以第二個參數為底,例如 ./log40968會印4,而./log2433會印 5。

#!/usr/bin/perl-w usestrict; my($base,$ans)=(2,0); if($#ARGV>1or$#ARGV<0){ die"usage:lognumber[base]\n"; }elsif($#ARGV==1){ $base=$ARGV[1]; } my($n)=$ARGV[0]; while($n>1){ $n/=$base; ++$ans; } print"log($ARGV[0])base$baseisroughly$ans\n"; 心得: 變數可以在宣告的同時,一併設定初始值。

注意等號右邊的語法, 是不是和陣列設定初始值很像? 邏輯判斷if-then-else,在perl裡面當然也可以用。

注意perl 多了一種子句"elsif"讓程式看起來比較簡單。

如果是在c裡面, 這必須拆成"else{if...}"又多了一層縮排,看起來比較複雜。

熟悉c的同學請注意:即使大括弧裡面只有一句話, 大括弧還是一樣不可以省略。

這一點看起來好像輸給c;不過perl 有其他省略的方法。

如果出現使用者輸入資料錯誤等狀況,程式做不下去了,可以用die 結束程式。

記得印出有用的錯誤訊息。

隨時隨地都可以宣告變數,也不限一次。

有關變數 Perl裡面的變數不分整數/浮點數/字元/字串/...,一律都叫做 scalar純量.Perl是我們肚子裡的蛔蟲, 它會觀察你想對這個純量變數做什麼運算,根據你呼叫的function 函數或你用的operator運算子 來決定要把這個純量變數當做數字還是字串.例:請在上面範例中的 "純量變數版"兩個數字外面加上引號,像這樣:$x="13"; 看看結果有何不同.例:請在"陣列版"的最後面加上一句print length($sum),"\n";看看是否會出現錯誤訊息. Perl裡面的變數,乃是根據複雜程度-- 儲存資料的多寡來分類. 以$開頭的是scalarvariable純量變數. 一個純量變數可以放一個數字或一個字串. 以@開頭的是array陣列,一個陣列變數@x 裡面放著很多個純量,從第0號按順序排到第$#x號。

Q: 如何判斷一個陣列變數有沒有元素?請對@ARGV作實驗,驗證你的假說。

可以這樣子填初始值:@x=("guava","pineapple", "banana");而用$x[0]或$x[1]或...或$x[$#x]存取@x 的個別元素: 以%開頭的是hash(雜湊?)在其他語言中,稱為 associatedarray關聯陣列.一個hash%x裡面放著很多對純量 (比陣列厲害吧),沒有任何次序地散成一堆.每一對純量當中,一個叫key, 功用是搜尋資料;另一個叫value,它才是真的要存取的資料本身. 可以這樣子填初始值:%x=("pig"=>98.3,"cat"=>2.5, "dog"=>5.3");而用$x{"pig"}或$x{"cat"}或...存取%x 的個別元素:可以把hash想成是一個對照表. 也可以將它想成是具有特異功能的陣列:一般的陣列用整數作為註標;而 hash則可以用任何字串作為註標. 注意: $speed是一個純量變數;$speed[3]也是一個純量變數,但它和 $speed無關,它是@speed陣列內的一個元素;$speed{"bike"} 又是另一個和$speed無關的純量變數,它是%speed這個hash 內的一個元素. 為array和hash設定初始值時,等號右邊都是小括弧! 用小括弧括起來的東西叫做list,以後再詳述. 更詳細的討論,請見perldata(1)(<==這個的意思是下 man1perldata) 其他常識 在雙引號內,perl還是認得純量變數與陣列變數(但不認得hash) 會把它的值代換進去.例如 $name="kitty"; @animals=("dog","cat","sheep","fish"); %x=("pig"=>98.3,"cat"=>2.5,"dog"=>5.3); print"$name,@animals,%x\n"; print@animals,"\n"; C語言當中常用的數學運算子,在perl當中都可以用,例如+,-,*, /,%,<>,++,--,<<=,>>=;==,!=, ...注意:比較數字是否相等,要用==而比較字串是否相等, 要用eq 邏輯運算子and/or/not,可以用c的語法&&/||/!, 也可以用口語化的寫法。

雖然三個看起來像符號;三個看起來像名字, 但其實都是運算子operator, 唯一的差別是優先順序高低不同。

(前三者低,後三者高) 為了方便除錯,習慣上在呼叫perl時加上-w參數,要perl 多產生一些警告訊息;同時要記得usestrict。

建議使用Linux環境的讀者,學會使用 readline與 less, 非常有助於加速操作. 作業 請將"純量變數版"裡面的...$x+$y... 故意改成錯誤的...$x+$z...。

然後不用-w執行一次; 再用-w執行一次。

程式有沒有執行並印出和?有沒有印出錯誤訊息? 同樣故意將"變數宣告版"裡面的$y改成$z。

同樣不用-w-w 執行一次;再用-w執行一次。

這次程式有沒有執行並印出和? 有沒有印出錯誤訊息?呢?又請這樣執行"好用版":perl-w test.pl13看看發生什麼事? 請查字典解釋印出來的錯誤訊息。

從命令列上輸入m與n兩個數字,計算m的n次方,像這樣: ./power63印出216而./power2.5-2 印出0.16。

可以假設n一定是整數(但可能是正整數或負整數)。

(暫時不准用**這個運算子) 把命令列上所有奇數加總;又把命令列上所有偶數加總; 同時還要數數看命令列上出現幾個0,像這樣:./o_e_sum5126 087140印出 sumofoddnumbers:13 sumofevennumbers:30 numberofzeros:2 把命令列上第0,2,4,6,8,...個參數相加;又把命令列上第1,3,5,7,9, ...個參數相加,像這樣:./alt_sum5126087140 印出 sumofallnumbersatevenpositions:20 sumofallnumbersatoddpositions:23 提醒:不習慣寫程式的同學,千萬不要眼高手低,貪心想要一口氣完成。

要養成腳踏實地的習慣,先把題目先一路簡化到到自己可以處理的程度, 再逐次增加功能。

寫一點,就測試一下,比較容易除錯, 也比較容易有成就感。

不會分奇偶數求和?先退一步想,至少可以先求所有元素的和吧? 不會求所有元素的和?再退一步想, 至少可以先把讀進去的資料全部原封不動地印出來吧? 不會讀資料?更退一步想,至少可以把資料寫死, 從一個固定的陣列裡面抓出來求和吧?(像陣列版) 而且天下程式一大抄,將問題簡化夠了,就很容易找到類似的範例程式, 從原本就可以動的程式開始改起,怎麼可能交白卷呢? 本頁最新版網址: https://www.cyut.edu.tw/~ckhung/b/pl/basic.php; 您所看到的版本:February14201202:32:25. 作者:朝陽科技大學資訊管理系洪朝貴 寶貝你我的地球,請 減少列印,多用背面,丟棄時做垃圾分類。

本文件以 CreativeCommonsAttribution-ShareAlikeLicense 或以 FreeDocumentLicense方式公開授權大眾自由複製/修改/散佈。



請為這篇文章評分?