【文章內容簡介】
050(1+2+3…+100)然后,函數(shù)__AddUpTo()把根據(jù)傳遞進來的參數(shù)(100)計算出來的結果(5050)返回給第8行的代碼,“$result = __AddUpTo(100)”,即,從此之后,變量$result的值就是5050。再然后,第9行代碼呼出一個對話框,顯示結果……現(xiàn)在,新建一個AutoIt文件,輸入以下代碼:Func __AddFromUpTo($a, $b) $r = 0 For $i = $a To $b $r = $r + $i Next Return $rEndFunc$result = __AddFromUpTo(101, 200)MsgBox(0, Result, $result)這次我們定義的函數(shù)名稱叫__AddFromUpTo(),它需要兩個參數(shù),返回值是從第一個參數(shù)加到第二個參數(shù)究竟等于多少:現(xiàn)在,嘗試一下,:$result = __AddFromUpTo(200)而后按F5執(zhí)行,結果是跳出一個“出錯提示”對話框:這是因為當初定義__AddFromUpTo()就指明調用它的時候需要提供兩個參數(shù),而現(xiàn)在卻只提供了一個參數(shù),所以,計算機“糊涂”了,弄不明白你究竟想干什么……新建一個AutoIt文件,輸入以下代碼(不要按F5查看結果,而是先嘗試著用腦演練一番,看看自己能不能想出正確結果……):Func __AddFromUpTo($a=1, $b=100) $r = 0 For $i = $a To $b $r = $r + $i Next Return $rEndFunc$result = __AddFromUpTo()MsgBox(0, Result, $result)$result = __AddFromUpTo(50)MsgBox(0, Result, $result)$result = __AddFromUpTo(101,200)MsgBox(0, Result, $result)這一次,我們在定義__AddFromUpTo()之時,為它的兩個參數(shù)都提供了“默認值”,第一個參數(shù)默認是1,第二個參數(shù)默認是2。即,如果在調用這個函數(shù)的時候并未向其傳遞參數(shù)的話,那么就使用默認值進行運算(并返回相應的結果)。所以, 調用__AddFromUpTo(),相當于沒有提供任何參數(shù),所以它按默認值運算,返回的應該是(5050); 調用__AddFromUpTo(50),相當于向__AddFromUpTo()函數(shù)提供了第一個參數(shù)(50),而第二個參數(shù)由于未被提供,所以采用默認值(100),于是,這個函數(shù)調用所返回的應該是3825(50+51+52…100); 調用__AddFromUpTo(101,200),向該函數(shù)提供了它所需要的全部兩個參數(shù),所以,該函數(shù)內部的運算不使用任何默認值,而是計算從101加到200的結果,并返回(15050)。 現(xiàn)在按F5查看一下執(zhí)行結果:現(xiàn)在,再回顧一下我們剛剛遇到的一些概念: 函數(shù)名 參數(shù)、默認參數(shù) 返回值 定義 調用 作業(yè):重新去反復閱讀若干遍ConsoleWrite()、InputBox()和MsgBox()這三個函數(shù)的幫助文檔。AutoIt教程:6. 數(shù)組by 李笑來 on 2010/05/01in AutoIt變量(Variable)是用來保存一個數(shù)據(jù)的,數(shù)組(Array)是用來保存一系列數(shù)據(jù)的。比如,我們可以把一個班里所有人的名字保存到一個數(shù)組之中。事實上,你可以把數(shù)組理解為“最簡單形式的數(shù)據(jù)庫”,或者“只有一列數(shù)據(jù)的表單”。Dim $name[5]$name[0] = Tom$name[1] = Jerry$name[2] = Mike$name[3] = Joey$name[4] = Jane注意,方括號內的“下標”,是zerobased,即,從零開始。所以,在第1行代碼中我們定義了一個總計有5個元素的數(shù)組,名稱是$name,第一個元素用$name[0]表示,最后一個元素用$name[4]表示。數(shù)組中的每一個元素,相當于一個變量,可以保存一個數(shù)據(jù)。用一個循環(huán)語句,就可以遍歷(逐一訪問,或讀,或存)所有元素:For $i = 0 To 4 MsgBox(0, $i, $name[$i], 1)Next數(shù)組的操作向來很麻煩。不過,幸運的是,AutoIt安裝的過程中提供了很多UDF,即所謂的“用戶自定義函數(shù)庫”。UDF,是User Defined Function的首字母縮寫。AutoIt是免費開源的軟件,所以有很多人參與了開發(fā)過程,同時寫了許多各式各樣的,能夠完成特定功能的函數(shù)。一旦你需要使用數(shù)組,最方便的方法就是直接調用一些UDF中的函數(shù)。引用UDF函數(shù)庫的方法是在程序開頭添上這樣一句:include 之后,你就可以用_ArraySort()為某個數(shù)組排序,用_ArraySwap()為某兩個元素調換位置,用_ArrayDisplay()顯示一個數(shù)組內容,或者用_ArrayUnique()查詢某個元素的值在整個數(shù)組中是否是唯一的……UDF中關于數(shù)組管理的所有函數(shù)……如果一個數(shù)組是“動態(tài)形成的”,或者,在程序運行過程中,數(shù)組增加或減少了一些元素,那么我們可以用UBound()函數(shù)得知某個特定數(shù)組的元素數(shù)量。新建一個AutoIt文件,輸入以下代碼,并按F5運行,查看結果:include Dim $name[5]$name[0] = Tom$name[1] = Jerry$name[2] = Mike$name[3] = Joey$name[4] = JaneFor $i = 0 To 4 MsgBox(0, $i, $name[$i], 1)Next_ArrayDisplay($name)_ArrayAdd($name, Mary)_ArrayDisplay($name)MsgBox(0, Info, Now the array $name has amp。 UBound($name) amp。 elements...)_ArraySort($name)_ArrayDisplay($name)_ArrayReverse($name)_ArrayDisplay($name)注意:當_ArrayDisplay()顯示對話框的時候,程序會暫停,知道你按關閉按鈕關閉該對話框之后,程序將繼續(xù)運行。作業(yè):把所有UDF中的關于數(shù)組管理的函數(shù)都拿出來調用、試驗一遍。與此同時,還要“硬著頭皮”精讀每個函數(shù)的幫助文檔……提示:調用每個函數(shù)之后,都可以調用_ArrayDisplay()來查看數(shù)組的內容變化……AutoIt教程:7. 文件讀寫by 李笑來 on 2010/05/02in AutoIt用AutoIt可以很方便地讀寫文本文件。新建一個AutoIt文件,輸入以下代碼:。Once I read in an article:。 Take a piece of paper, right now, and write out the word ATTITUDE.。 Now assign each letter the number that letter corresponds to and。 add those numbers up. Guess what, they add up to 100%. A=1, T=20,。 T=20, I=9, T=20, U=21, D=4, E=5 = 100%. Attitude is everything folks.。 You can’t hide it。 you can’t even deny it.。 It’s who you are. It’s the outside of your inside.。I thought, Oh! Really?。Seconds later, I became suspicious of this claim...。OK, let39。s find out the truth, since we have tools to utilize...InetGet(, , 0)$file = FileOpen(, 0)While 1 $line = FileReadLine($file) If @error = 1 Then ExitLoop $lineElements = StringSplit($line, ) If AddUpCharactersInWordAsNumber($lineElements[3]) == 100 Then ConsoleWrite($lineElements[3] amp。 @CRLF) EndIfWEndFileClose($file)MsgBox(0, , Finished!)Func AddUpCharactersInWordAsNumber($word) $wordLowerCase = StringLower($word) $Characters = StringSplit($wordLowerCase, ) $count = 0 For $i = 1 To $Characters[0] $count = $count + Asc($Characters[$i]) 96 Next Return $countEndFunc按F5查看一下運行結果。再隔一篇文章,我才會詳細解釋這些代碼──因為還有一些細節(jié)需要交代。讓我們先了解一下AutoIt是怎樣進行文件讀寫的。請閱讀一下以下代碼:$file = FileOpen(, 0)While 1 $line = FileReadLine($file) If @error = 1 Then ExitLoop ...WEndFileClose($file)查看幫助文檔的話,它告訴你說,F(xiàn)ileOpen()這個函數(shù)返回一個File “Handle”(翻譯成中文,是一個不知所云的詞組“文件句柄”)。實際上,還不如干脆把這一行代碼完整翻譯成自然語言:$file = FileOpen(, 0)相當于:從此之后,我們就可以用變量$file指代那個以只讀模式打開并保存于內存中的””文件。[1] While后面的1是怎么回事兒?幫助文件里,While…WEnd的示例是這么寫的:While statements ...WEndWhile后面接一個表達式,即,“當這個表達式為真之時,循環(huán)執(zhí)行以下代碼……”事實上,對AutoIt來說,1也是一個表達式,這個表達式的運算結果就是1。AutoIt從設計初始,就被定義為“弱類型”語言,即,對數(shù)據(jù)類型的定義不嚴格(至于這句話究竟是什么意思,以后的文章中會詳細解釋)。于是,在AutoIt中,1和True是一回事(暫時別奇怪你為什么搞不清楚這句話的因果關系,反正記住1和True是一回事就行了)──都可以當作表達式,且它們的值是相同的。所以,While 1...WEnd是個無限循環(huán)。While 1 … WEnd之間的代碼會無窮無盡地重復執(zhí)行下去,除非……請注意這行代碼:If @error = 1 Then ExitLoop在循環(huán)內部,每次執(zhí)行$line = FileReadLine($file)的時候,F(xiàn)ileReadLine()都從$file里讀出一行內容,并保存到變量$line之中($line就成了一個字符串變量)……FileReadLine()的幫助文檔里寫著:Return ValueSuccess: Returns a line of text.Special: Sets @error to 1 if endoffile is reached.也就是說,當讀到文件結尾的時候,這個函數(shù)會把@error的值設置為1。這里有兩個東西要解釋:1. endoffile,又常常被縮寫為EOF。它是所有文本文件的末尾的一個用記事本打開看不到的字符(文本文件中用記事本打開看不到的字符有很多,比如換行符Carriage Return Line Feed……)。當FileReadLine()讀到這個字符之時,它就“知道”文件已經全部讀取完畢了。 2. @error,是AutoIt內建的一個“宏”,它的初始值是0。你不妨新建一個AutoIt