perl腳本參數
1. linux下 如何用perl腳本給程序傳參(argv)
把執行perl腳本的指令放在反引號之間
./test `perl -e 'print "A"x128'`
`這個符號在鍵盤tab的上邊,1的左邊
還可以放在$()中
./test $(perl -e 'print "A"x128')
這個test是一個linux命令,最好不要用作程序名
2. perl 如何在一個perl腳本程序里調用另一個需要運行參數的perl腳本程序 例如有一個a.
你首先需要關聯.pl文件到perl.exe,雙擊b.pl能執行就是關聯好了的,然後在b.pl裡面這樣寫代碼就可以:
$f='abc.txt';
system "a.pl --show-timer -f $f";
3. Perl中的默認變數@_和$_什麼意思
@_ 在某個函數內,數組 @_ 包含傳遞給該函數的所有參數。
$_ 默認的輸入/輸出和格式匹配空間
--------------------------------------------------------------------------------------------------------
@_的示例:
#!/bin/perl -w
use strict;
&fun( 111,222,333 );
sub fun()
{
print @_;
}
這里會把傳入函數的參數111222333列印出來。
---------------------------------------------------------------------------------------------
$_示例:
下面的幾對代碼都是等同的:
while (<>) {...} # equivalent only in while!
while (defined($_ = <>)) {...}
/^Subject:/
$_ =~ /^Subject:/
tr/a-z/A-Z/
$_ =~ tr/a-z/A-Z/
chomp
chomp($_)
以下是幾處即使沒有寫明 Perl 也會假定使用 $_ 的地方:
* 各種單目函數,包括像 ord() 和 int() 這樣的函數以及除 "-t"
以外所有的文件 測試操作 ("-f","-d"),"-t" 默認操作 STDIN。
* 各種列表函數,例如 print() 和 unlink()。
* 沒有使用 "=~" 運算符時的模式匹配操作 "m//"、"s///" 和
"tr///"。
* 在沒有給出其他變數時是 "foreach" 循環的默認迭代變數。
* grep() 和 map() 函數的隱含迭代變數。
* 當 "while" 僅有唯一條件,且該條件是對 "<FH>"
操作的結果進行測試時,$_ 就是存放輸入記錄的默認位置。除了
"while" 測試條件之外不會發生這種情況。
(助記:下劃線在特定操作中是可以省略的。)
--------------------------------------------------------------------------------------------------
@_和$_都是perl很常用的特殊變數。建議系統看一下《perl語言入門》。
----------------------------------------------------------------------------------------------------------------
另附perl常用特殊變數列表:
perl 內置變數
$- 當前頁可列印的行數,屬於Perl格式系統的一部分
$! 根據上下文內容返回錯誤號或者錯誤串
$」 列表分隔符
$# 列印數字時默認的數字輸出格式
$$ Perl解釋器的進程ID
$% 當前輸出通道的當前頁號
$& 與上個格式匹配的字元串
$( 當前進程的組ID
$) 當前進程的有效組ID
$* 設置1表示處理多行格式.現在多以/s和/m修飾符取代之.
$, 當前輸出欄位分隔符
$. 上次閱讀的文件的當前輸入行號
$/ 當前輸入記錄分隔符,默認情況是新行
$: 字元設置,此後的字元串將被分開,以填充連續的欄位.
$; 在模擬多維數組時使用的分隔符.
$? 返回上一個外部命令的狀態
$@ Perl解釋器從eval語句返回的錯誤消息
$[ 數組中第一個元素的索引號
$\ 當前輸出記錄的分隔符
$] Perl解釋器的子版本號
$^ 當前通道最上面的頁面輸出格式名字
$^A 列印前用於保存格式化數據的變數
$^D 調試標志的值
$^E 在非UNIX環境中的操作系統擴展錯誤信息
$^F 最大的文件捆述符數值
$^H 由編譯器激活的語法檢查狀態
$^I 內置控制編輯器的值
$^L 發送到輸出通道的走紙換頁符
$^M 備用內存池的大小
$^O 操作系統名
$^P 指定當前調試值的內部變數
$^R 正則表達式塊的上次求值結果
$^S 當前解釋器狀態
$^T 從新世紀開始算起,腳步本以秒計算的開始運行的時間
$^W 警告開關的當前值
$^X Perl二進制可執行代碼的名字
$_ 默認的輸入/輸出和格式匹配空間
$| 控制對當前選擇的輸出文件句柄的緩沖
$~ 當前報告格式的名字
$` 在上個格式匹配信息前的字元串
$』 在上個格式匹配信息後的字元串
$+ 與上個正則表達式搜索格式匹配的最後一個括弧
$< 當前執行解釋器的用戶的真實ID
$ 含有與上個匹配正則表達式對應括弧結果
$= 當前頁面可列印行的數目
$> 當前進程的有效用戶ID
包含正在執行的腳本的文件名
$ARGV 從默認的文件句柄中讀取時的當前文件名
%ENV 環境變數列表
%INC 通過do或require包含的文件列表
%SIG 信號列表及其處理方式
@_ 傳給子程序的參數列表
@ARGV 傳給腳本的命令行參數列表
@INC 在導入模塊時需要搜索的目錄列表
$-[0]和$+[0] 代表當前匹配的正則表達式在被匹配的字元串中的起始和終止的位置
4. 帶有配置參數的perl腳本如何調試
腳本保存後,用在cmd命令里邊直接運行,調試也比較方便的
5. 求教,怎樣用perl 讀命令行傳進來的參數,
最簡單的是用@ARGV獲得命令後面的參數表
如執行「perl ppp.pl 1 2 3 4 5」
ppp.pl後面跟著5個參數,在程序中可以直接通過調用$ARGV[0],$ARGV[1],$ARGV[2],$ARGV[3],$ARGV[4]來分別調取。
6. perl腳本編寫
open IN,"<$ARGV[0]";
open OUT,">$ARGV[1]";
while(<IN>){
@a=split("",$_,29);
if($a[28]=~m/\s/){
print OUT "$_";}
close IN;
close OUT;
望採納
7. perl腳本中$ARGV[0]是什麼意思
$ARGV[0]是從命令行來的,$ARGV[0]是程序名,$ARGV[1]是第一個參數,一次類推。
例如執行下面的命令:
test.pl abc .def
或者:
perl test.pl abc def
那麼:
$ARGV[0]=='test.pl'
$ARGV[1]='abc'
$ARGV[2]='def'
8. 誰幫我解釋下這個Perl腳本,越詳細越好
在指定目錄下,遍歷所有文件包括子目錄下文件,尋找關鍵詞,並列印出來!
指定目錄為第一個參數,關鍵詞為第二個,比如該腳本名為 find.pl
用法應該就是 find.pl<空格>目錄名<空格>文件名。 有段時間沒用perl了,大概說一下吧,不對的見諒阿。
#!/usr/bin/perl ##類unix系統下告知系統這是perl腳本 前提是需要文件為可執行
sub subdir { ##找到和這個 { 向對應的 } 這里是 過程 subdir 大體功能是把目錄存入數組@dir
##把文件存入數組@file
@tmp=(); ##聲明臨時數組@tmp
$rootdir=shift; ##從參數中讀取目錄名,就是subdir($ARGV[0])里的$ARGV[0].
opendir(DIR, $rootdir);##打開目錄
@tmp = readdir(DIR);##讀取目錄,把目錄下的文件和子目錄名字都讀進取。只是名字哦!
$start=@dir;#目錄數組的舊終點 ##設置標志位,用於在主程序中判斷目錄是否為空
for (local $i=2;$i<=@tmp-1;$i++) #從2開始是要跳過./和../目錄
{ ##開始對@tmp下的內容進行分類整理
if (-d $rootdir.'/'.$tmp[$i]) {push (@dir,$rootdir.'/'.$tmp[$i]);} #是目錄(文件夾)放進@dir數組
if (-f $rootdir.'/'.$tmp[$i]) {push (@file,$rootdir.'/'.$tmp[$i]);}##是文件,放進@file數組
}
$end=@dir;#目錄數組的新終點 ##設置另一個標志位,用途同$start。
closedir(DIR); #關閉句柄
@tmp=();# 臨時數組清空 ,為了後續讀取子目錄下的內容做准備。
#print $start."-";
#print $end."\n";
}
subdir($ARGV[0]); ##這里是主程序開始的地方,@ARGV數組包含環境變數,就是執行的時候
##跟在文件名後面的東西開始第一個就是$ARGV[0],第二個是ARGV[1],以此類推.....
#start=end說明經過上一條(下一條)命令,數組沒有變化(開始兼結尾)
if ($start ne $end) {for ($k=$start;$k<=$end-1;$k++){subdir($dir[$k]);}}
##上面這條的意思就是,如果該目錄下無子目錄那就算了,如果有,用subdir挨個處理子目錄
##個人認為這個寫的有問題,因為如果$ARGV[0]所指目錄包含2層以上(含兩層)子目錄的話,
##腳本就做不好完全的遍歷....具體改進方法可參考下面文件讀取時的做法..
#foreach $f (@file){
#chomp $f;
#print "$f\r\n";
#}
#exit;
foreach $f (@file){##此時@file數組中保存的全部都是文件名
chomp $f; ##除去文件名後的 換行符
open F,$f or next; ##打開文件句柄,打不開這個就去試試打開下一個.....
while(<F>){ ##讀取文件,一行一行來,讀取到EOF標志是while循環結束
if($_=~ m/$ARGV[1]/){ ##如果當前行中有和 $ARGV[1]中需要查詢字元一樣的字元
print "$f\r\n";last; ##列印出文件名
}
}
close F; ##關閉文件句柄
}
----------------------------------差不多就是這樣的了,perl用起來還是很方便的就是需要記的東西相對多點兒,而且一點不對,不好調試,這個腳本寫的不是很規范,雖然語法檢查沒問題。但是運行起來貌似有死循環,最後只好kill掉了..........目前只能看這么多了
9. 如何調試perl腳本
進入退出:
perl
-d debugtest用調試器載入perl程序運行,互動式界面
Loading
DB routines from perl5db.pl version 1.3
Editor
support available.
Enter
h or `h h' for help, or `perldoc
perldebug'
for more help.
main::(p4.pl:2): my($xx,$yy)=(1,1);
DB<1>
先是歡迎信息,顯示第一個可執行行:程序將要執行的當前行號。包名,文件名,文件中的行號。
提示符DB<n>
n為命令行號。h可看幫助,q退出調試器
l
預設顯示10行 再輸入l接著顯示10行
l
10 指定顯示第10行
l
8-10 指定顯示行的范圍
l
8+3 指定從哪行開始多少行。
l
subs 指定顯示函數,提供函數名。如果太長只顯示前幾行,用l接著顯示
-
顯示在當前行前面的行,再輸入-繼續向前
w
7 包含指定行的顯示窗口 windows可能不一樣
//
?? 從當前行搜索包含指定模式的行 /find/
//從前向後正向搜索,??從後向前逆向搜索 可忽略?? //中後面的? /。
S
列出所有函數,包名::函數
無參數的預設形式列出所有底層和繼承的函數,太多。加上搜索模式,指定當前程序包 S main可列出含main的函數
s 執行單條語句 顯示下一條要執行的語句。如果需要交互會等待輸入。
對於函數,僅僅是進入不執行,如果不進入函數內部,要跳過用n。不能進入系統內部的庫函數,只能進入自己定義的
n 執行一行程序,stepover 不進入函數。
f 執行當前函數剩下的語句,顯示跟隨函數的語句
step
out 舊命令,現在為切換文件名
回車
如果執行了s或n,以後只用回車重復執行上一個s或n的命令。
r 在函數中執行到函數外
b 10
在哪一行設置斷點。如果此行非執行語句,顯示不能設置斷點。如果一條語句有多行,則在第一行設置,其餘行不能設置。
b func在函數處設置斷點
b 10
($curdir eq
"") 當條件為真時中斷執行
c
執行到斷點或終止。繼續
c
12臨時斷點,只中斷一次,繼續執行在12行中斷。
L
列出所有斷點。列出前幾行,當前行,斷點。斷點條件。
B
10刪除斷點。不帶參數認為是下一行是斷點。
B *
刪除所有斷點。
X
var 不帶參數列出main包的所有變數,包括預定義的變數。指定變數不帶$,@。可能是符號表中的變數才行。現在與V同。
V
var 列出任何包的變數。只指定包名列出包的所有變數。指定包及變數為main
var。無::
S
列出所有可用的函數,包名::函數 無參數的預設形式列出所有底層和繼承的函數,太多。加上搜索模式,
指定當前程序包
S
main可列出含main的函數
p
expr
指印表達式值。把標准輸出重定向也會輸出到屏幕。
程序到達某一行時指定執行一條或多條語句。常見的行動作是顯示變數值或把含錯誤值的變數重置為指定的值
a
10 print ("curdir is $curdir\n") 多條語句在一行中用分號;分開,當要續行時用\ 執行完第10行執行指定的語句。
A
*刪除所有行動作
A 10刪除第10行的動作
>
print 在程序開始執行前執行語句。無參數形式刪除設置
<
print 在程序執行完成後執行語句。無參數形式刪除設置
跟蹤 顯示每一個執行行。
t
打開,關閉跟蹤。每執行顯示一行。
任何非調試命令的perl語句都可執行。分號可忽略。更改變數值。
H
列出從前命令
!
n 執行從前命令。忽略行號執行上一條命令
n=-2跳過2條命令。從當前H列表逆向跳過。
T
棧跟蹤。調用級
$
= &main::sub2('hi') from file debug1 line 7
$
= &main::sub1('hi') from file debug1 line 3
當前程序在第7行,在main包的sub2函數中,以hi為實際傳遞的參數。返回簡單變數,此函數由sub1調用。
=
別名 命令 給命令定義別名 =
pc print ("curdir is $curdir\n");別名存在%DB(%DB::alias)中。無參數列出定義的別名。輸入pc列印語句。
預定義別名:每次載入調試器自動定義別名。在.perldb中加入$DB'alias{"pc"} = 's/^pc/print
("curdir is $curdir\n");/';
錯誤檢查
Lint perl -MO=Lint,-u pl 編譯時檢查
perldiag錯誤信息
-w 重定義函數變數未使用
Use strict;
use diagnostics 警告信息。
命令行參數簡介
-c 語法檢查
-v版本
-w警告信息
-e執行單行程序
-s為程序提供命令行選項。perl -s prog.pl
-q =>$q=1作為選項。不出現在@ARGV中。否則不加-s,-q作為字元串存在@ARGV中。可賦值-abc="abc"
跟在程序名後帶-的是選項,不帶-的不是,不是選項的項後面的所有都不是選項。
-P先運行c預處理器,輸出再由perl執行
-I指定目錄中的包含文件
-n循環處理多個文件。不用while
-p讀文件行並顯示。同n,不用print自動顯示。
-i編輯文件,讀然後寫迴文件。
-a分割行到@F
-F分割模式,指定分割符
-0
指定輸入行結束符,用八進製表示
-1
指定輸出行結束符
-x從消息中抽取程序。忽略行,直到遇到#!..perl。到文件尾,ctrl-d
ctrl-z __END__時結束
-u產生coremp
-U可以執行不安全操作
-S從路徑中查找程序
-D設置調試標志
-T寫安全程序。從外部獲得的數據不能作為命令或修改文件系統
-d使用調試器