五大常用Perl命令列引數應用介紹

2021-06-27 20:14:02 字數 3620 閱讀 5974

perl命令列應用介紹

perl語言中有很多perl命令列引數.通過它們,我們有機會寫出更簡單的程式,在這篇文章裡我們來了解一些常用的引數。

第一部分:safetynetoptions安全網引數

在使用perl嘗試一些聰明(或stupid)的想法時,錯誤難免會發生.有經驗的perl程式設計師常常使用三個引數來提前找到錯誤所在,

1:-c

這個引數編譯perl程式但不會真正執行它.由此檢查所有語法錯誤.每次修改perl程式之後我都會立刻使用它來找到任何語法錯誤.

$perl-cprogram.pl

2:-w

它會提示你任何潛在的問題.perl5.6.0之後的版本已經用usewarnings;替換了-w.你應該使用usewarnings因為它要比-w更靈活.

3:-t

它把perl放到了tain模式.在這個模式裡,perl會質疑任何程式外傳來的資料.例如,從perl命令列讀取,外部檔案裡讀取或是cgi程式裡傳來的資料.

這些資料在-t模式裡都會被tainted掉.

第二部分:perl命令列perl引數:可以讓短小的perl程式執行在perl命令列.

1:-e

可以讓perl程式在perl命令列上執行.

例如,我們可以在perl命令列上執行"helloworld"程式而不用把它寫入檔案再執行.

$perl-e'print"helloworld\n"'

多個-e也可以同時使用,執行順序根據它出現的位置.

$perl-e'print"hello";'-e'print"world\n"'

象所有的perl程式一樣,只有程式的最後一行不需要以;結尾.

第三部分:隱式迴圈

3:-n

增加了迴圈的功能,使你可以一行一行來處理檔案

$perl-n-e'print;'1.txt#####$perl-ne'print;'1.txt

這與下面的程式一樣.

line:  while(<>;)
<>;開啟perl命令列裡的檔案,一行行的讀取.每一行預設儲存在$_

$perl-n-e'print"$.-$_"'file

上面的這一行可以寫成

line:  while(<>;)
輸出當前行數$.和當前行$_.

4:-p,和-n一樣,但是還會列印$_的內容

如果想在迴圈的前後做些處理,可以使用begin或endblock.下面的這一行計算檔案裡的字數.

$perl-ne'end@w=/(\w+)/g;$t+=@w'file.txt

每一行所有匹配的字放入陣列@w,然後把@w的元素數目遞加到$t.endblock裡的print最後輸出檔案總字數.

還有兩個引數可以讓這個程式變得更簡單.

5:-a

開啟自動分離(split)模式.空格是預設的分離號.輸入根據分離號被分離然後放入預設陣列@f

使用-a,上面的命令可以寫成這樣:

$perl-ane'end$x+=@f'file.txt##使用了-a

6:-f

把預設的分離號改為你想要的.例如把分離號定為非字元,上面的命令可以改為:

$perl-f'\w'-ane'end$x+=@f'file.txt

下面通過unixpassword檔案來介紹乙個複雜的例子.unixpassword是文字檔案,每一行是乙個使用者記錄,

由冒號:分離.第7行是使用者的登入shell路徑.我們可以得出每乙個不同shell路徑被多少個使用者使用:

$perl-f':'-ane'$s++;'\>;-e'end"forkeys%s}'/etc/passwd

雖然現在不是一行,但是你可以看出使用引數可以解決什麼問題.

第四部分:recordseparators資料分隔符

$/和$\--輸入,輸出分隔號.

$/用來分隔從檔案控制代碼裡讀出的資料,預設$/分隔號是\n,這樣每次從檔案控制代碼裡就會一行行的讀取

$\預設是空字元,用來自動加到要print的資料尾端.這就是為什麼很多時候print都要在末尾加上\n.

$/和$\可與-n-p一起使用.在perl命令列上相對應為-0(零)和-l(這是l).

-0後面可以跟乙個16進製制或8進製數值,這個值用來付給$/.

-00開啟段落模式,-0777開啟slurp模式(即可以一次把整個檔案讀入),這與把$/設為空字元和undef一樣效果.

單獨使用-l有兩個效果:

第一:自動chomp輸入分隔號

第二:把$/值付給$\(這樣print的時候就會自動在末尾加\n)

1:-l引數,用來給每乙個輸出加\n.例如

$perl-le'print"helloworld"'

第五部分:原位編輯

使用已有的引數我們可以寫出很有效的perl命令列程式.常見的unixi/o重定向:

$perl-pe'somecode'>output.txt

這個程式從input.txt讀取資料,然後做一些處理再輸出到output.txt.你當然也可以把輸出重定向到同乙個檔案裡.

上面的程式可以通過-i引數做的更簡單些.

2:-i

把原始檔更名然後從這個更名的原始檔裡讀取.最後把處理後的資料寫入原始檔.

如果-i後跟有其他字串,這個字串與源檔名合成後來生成乙個新的檔名.

此檔案會被用來儲存原始檔案以免被-i引數覆蓋.

這個例子把所有php字元替換為perl:

$perl-i-pe's/\bphp\b/perl/g'file.txt

程式讀取檔案的每一行,然後替換字元,處理後的資料重新寫入(即覆蓋)原始檔.

如果不想覆蓋原始檔,可以使用

$perl-i.bak-pe's/\bphp\b/perl/g'file.txt

這裡處理過的資料寫入file.txt,file.txt.bak是原始檔的備份.

perl經典的例子

問題:遇到一問題:

[email protected]

[email protected]

[email protected]

[email protected]

類似這種輸出,我想把他們變換成下面形式:

[email protected]

[email protected]

就是將相同郵箱名稱後面的數字相加。各位大俠能否給些思路如何用perl來實現。

答案:perl-anle'$cnt+=$f[1];end"forkeys%cnt}'urfile

如果熟悉了上面幾個perl命令列引數的用法,上面的這個命令應該很好理解:

每次讀取urfile的一行,由於使用了-a,開啟自動分離(split)模式.空格是預設的分離號.輸入根據分離號被分離然後放入預設陣列@f中,

以檔案的第一行為例子$f[0]就是[email protected],$f[1]就是2

$cnt+=$f[1]就是乙個雜湊陣列,以$f[0]為key,$f[1]為value,把相同key的數值都疊加起來.然後把檔案的每一行都這樣處理一次.

end{}就是在迴圈完之後再處理.裡面的意思就是列印這個%cnt雜湊陣列.這個雜湊陣列的key就是郵箱名稱,value就是疊加後的數字.

下面的是上面行命令的文字形式:

#!/usr/bin/perl  usestrict;  usewarnings;    my%hash;  while(<>)+=$array[1];  }   end\n";  }  }

Perl 命令列引數

一 perl中的命令列引數 perl提供了乙個特殊的內建陣列 argv來存放使用者從命令列輸入的引數 功能跟c c 的命令列引數一樣,但是實現上不太一樣 perl中定義的命令列引數不包含perl命令和perl命令後面的perl程式檔名,即 不包含 perl 程式檔名 也就是說,陣列 argv中存放的...

Perl的命令列引數和ARGV

0表示當前正在執行的perl指令碼名。有3種情況 如果執行方式為perl x.pl,則 0的值為x.pl而非perl命令本身 如果執行方式為.x.pl,則 0的值為.x.pl 如果執行的是perl e或perl e一行式perl程式,則 0的值為 e或 e ar 陣列索引從0開始計算,索引0位從指令...

php命令列常用引數

php i phpinfo資訊 檢視編譯引數 php i grep configure php r 執行一段php php r echo date y m d h i s php v php版本檢視 php m 檢視載入的模組 php ini 檢視php.ini的相關資訊 php s 啟動乙個內建的...