前言
2023.3.18 今天下載虛擬機(jī)把電腦磁盤(pán)內(nèi)容弄到亂七八糟,難受
發(fā)現(xiàn)每次學(xué)習(xí)遇到一個(gè)坎,感覺(jué)面前是一座大山,越過(guò)去之后又對(duì)前途充滿了希望
一、perl語(yǔ)言介紹
perl:practical extraction report language
實(shí)用提取和報(bào)表語(yǔ)言
從字面上看主要與文本處理相關(guān)
二、perl變量
變量定義關(guān)鍵詞:my
1、標(biāo)量 scalar
存儲(chǔ)數(shù)字、字符、字符串
,以$
符號(hào)開(kāi)頭,一般不會(huì)特別在意是字符串、浮點(diǎn)數(shù)還是整數(shù)
my $money = 100000;
my $name = xxx;
my $old_year = $year; //標(biāo)量直接賦值給一個(gè)標(biāo)量
1.1 數(shù)字
0377 八進(jìn)制,以 0 開(kāi)頭
0xFF 十六進(jìn)制,以 0x 開(kāi)頭
0b0000_1001 二進(jìn)制,以 0b 開(kāi)頭
1.2 字符串
字符串用單引號(hào)
或雙引號(hào)
括起來(lái)。
單引號(hào)內(nèi)不作轉(zhuǎn)義,而雙引號(hào)內(nèi)轉(zhuǎn)義。
雙引號(hào)字符串內(nèi)可以內(nèi)插其它標(biāo)量,意單引號(hào)字符串中的$僅表示美元符,不會(huì)內(nèi)插。
"hello \n" ---->hello 加回車
'hello \n' ---->hello \n 直接輸出
'a\'b' ---->a'b 單引號(hào)內(nèi)用'符號(hào),要加轉(zhuǎn)義符
my $a = "abc";
my $b = "def$a"; ---->$b = defabc
my $b = 'def$a'; ---->$b = def$a
1.2.1 字符串操作符
.
:拼接操作符,"verdi" . "2016"
"#" x 40
:表示#重復(fù) 40 次"-" x (40+5)
:表示-重復(fù) 45 次
1.2.2 字符串函數(shù)
index(string,substring,skipchars)
:返回子串 substring 在字符串 string 中的位置rindex(string,substring,skipchars)
:功能與 index()類似,不同的是它從 string 的右端開(kāi)始查找
length(string)
:求字符串的長(zhǎng)度
lc(string)
:把 string 中的所有字母都轉(zhuǎn)換成小寫(xiě)字母uc(string)
:把 string 中的所有字母都轉(zhuǎn)換成大寫(xiě)字母lcfirst(string)
:把 string 中的第一個(gè)字母轉(zhuǎn)換成小寫(xiě)字母ucfirst(string)
:把 string 中的第一個(gè)字母轉(zhuǎn)換成大寫(xiě)字母
substr(string,skipchars,length)
:該函數(shù)在字符串 string 中跳過(guò) skipchars 個(gè)字符的位置(從skipchars 位置處)開(kāi)始抽取長(zhǎng)度為 length 的子串。第一個(gè)字符的位置為 0join(sepatorstring,list)
:把列表 list 中的所有元素串聯(lián)到同一個(gè)字符串中,相鄰兩個(gè)元素之間使用 sepatorstring 分隔sprintf(formatstring,field1,field2,...,fieldn)
:對(duì)字符串進(jìn)行格式化,功能同 C 語(yǔ)言中的 sprintf()函數(shù),不同的是該函數(shù)返回格式化后的結(jié)果字符串,就是有返回值
2、數(shù)組 array
定義:同一類標(biāo)量
的組合,以@
符號(hào)開(kāi)頭
數(shù)組定義的同時(shí)就初始化
my @testcases = ("case0", "case1");
my @filelist = ();
$testcases[0] //引用數(shù)組的第一個(gè)元素,下標(biāo)從0開(kāi)始
my @array = ();
$array[0] = "0";
$array[99] = "99"; //1-98的元素值為undef
$#array //數(shù)組最后一個(gè)元素的索引值,比元素個(gè)數(shù)少1,例如上面例子就是99
my $array_size = $#array + 1; //求出數(shù)組array的大小
2.1 數(shù)組函數(shù)
push
:末尾增加一個(gè)元素pop
:取出數(shù)組末尾的元素shift
:取出數(shù)組開(kāi)頭的元素unshfit
:開(kāi)頭增加一個(gè)元素sort
:對(duì)數(shù)組排序foreach
:遍歷
foreach my $e (@array){
print "$e \n"
} //依次換行輸出數(shù)組里面的內(nèi)容
3、哈希數(shù)組 hash
定義:又稱關(guān)聯(lián)數(shù)組,以%
符號(hào)開(kāi)頭,類似用字符串來(lái)索引的數(shù)組,像python的字典和sv中的關(guān)聯(lián)數(shù)組。
3.1 數(shù)據(jù)拷貝
鍵Key => 值Value
my %dict = ("book" >= "UVM", "people" >= "xiaoli");
$dict{"book"} //引用哈希數(shù)組索引book所對(duì)應(yīng)的值
my $define_a_book = $dict{"book"}; //把book對(duì)應(yīng)的值賦值給其他標(biāo)量
3.2 地址拷貝
在 C++里是&
符號(hào),在 Perl 里是\
符號(hào)
my $arr_ref = \@arrs; //得到數(shù)組地址給一個(gè)標(biāo)量
my $hash_ref = \%hashs;
可以用@和%根據(jù)地址恢復(fù)出實(shí)際數(shù)組和哈希,也就是根據(jù)地址把數(shù)組和哈希數(shù)組的值重新賦值給一個(gè)新的數(shù)組和哈希數(shù)組tmp。
my @tmp = @$arr_ref;
my %tmp = %$hash_ref;
3、哈希數(shù)組函數(shù)
keys
:返回所有關(guān)鍵字構(gòu)成的數(shù)組values
:返回所有值構(gòu)成的數(shù)組exists
:確定某個(gè)鍵 Key 是否存在delete
:用來(lái)刪除某個(gè)鍵和值
my @mykey = keys %food;
my @myvalue = values %food;
foreach my $key (keys %food){
print "$key: $mykey{$key}\n"; //一一對(duì)應(yīng)輸出哈希數(shù)組的內(nèi)容
}
if(exsits $food{'apple'}){
...
}
delete $food{'apple'};
%food = (); //刪除所有,只需要把它賦值為空哈希
三、控制流語(yǔ)句
1、if
if…
if…else…
if…elsif…else…
即使{}
中的statement語(yǔ)句只有一條,{}也不能省略。當(dāng)只有一條時(shí)也有一種簡(jiǎn)寫(xiě)方式。
if($cell_cnt > 0){
print "$cell_cnt";
}
statement if ();
print "$cell_cnt" if($cell_cnt > 0);
2、while
while( ){ }:先判斷后執(zhí)行
do{ } while():先執(zhí)行后判斷
my $i = 10;
while($i > 0){
print "$i";
$i--;
} //輸出10 9 8 .. 1
do{
print "$i";
$i--;
}while($i > 0);
3、for
for(initialization; test; increment){ }
for(my $i = 0; $i<10; $i++){
print "$i ";
} //輸出為0 1 ... 9
4、foreach
前面已經(jīng)介紹過(guò)了
5、循環(huán)退出
last
:退出整個(gè)循環(huán),相當(dāng)于breaknext
:退出當(dāng)前這次循環(huán),相當(dāng)于continue
for(my $i = 0; $i<10; $i++){
if($i == 5)last;
print "$i ";
} //0 1 2 3 4
for(my $i = 0; $i<10; $i++){
if($i == 5)next;
print "$i ";
} //0 1 2 3 4 6 7 8 9
四、輸入輸出
1、鍵盤(pán)輸入和顯示屏輸出
尖括號(hào)<>
表示讀入一行,<STDIN>
表示從標(biāo)準(zhǔn)輸入流中讀取一行STDOUT
:表示輸出的顯示器(或終端界面)
my $line = <STDIN>; //接收鍵盤(pán)輸入得數(shù)據(jù),直至回車
print STDOUT "hello"; //也可以不寫(xiě)STDOUT
2、讀寫(xiě)文件
2.1 打開(kāi)文件
open(filehandle, mode, filename)
:filehandle
是文件句柄,相當(dāng)于文件的指針,一般用大寫(xiě)字母命名;mode
定義了文件操作模式,如讀寫(xiě)追加等;filename
是文件名,讀的時(shí)候文件不存在則會(huì)報(bào)錯(cuò),寫(xiě)的時(shí)候文件不存在則會(huì)自動(dòng)創(chuàng)建。返回值:0 表示失敗,1 表示成功。die
:當(dāng)文件打開(kāi)失敗時(shí)就會(huì)輸出錯(cuò)誤信息,終止運(yùn)行
open(FIN, "<", "123.txt") || die "can not open file, $!"; //FIN是文件句柄,不需要用my/$修飾
open(FIN, "<123.txt"); //也可以寫(xiě)成這種方式
2.2 移動(dòng)讀寫(xiě)指針
seek(filehandle, position, whence)
:whence
是三個(gè)值:0 表示文件一開(kāi)頭,1 表示當(dāng)前位置,2 表示文件末尾;position
是相對(duì)于 whence 相對(duì)偏移字節(jié)數(shù)。
返回值:0 表示失敗,1 表示成功。
seek(FIN, 54, 0); //相對(duì)文件開(kāi)頭偏移54個(gè)字符
seek(FIN, -5, 2); //相對(duì)文件末尾偏移5個(gè)字符,注意用負(fù)數(shù)
2.3 讀取文件內(nèi)容
undef
:既不是數(shù)字0,也不是空的字符串,是一個(gè)標(biāo)量,根據(jù)場(chǎng)合自動(dòng)歸為數(shù)字或字符串。read(filehandle, $buffer, length)
:讀取任意字節(jié),$buffer
是一個(gè)標(biāo)量,用來(lái)存放讀取的數(shù)據(jù);length
是要求讀取的字節(jié)數(shù);返回值是讀取的實(shí)際字節(jié)數(shù)
。如果讀出錯(cuò),則返回 undef
。
my $buf;
while(read(FIN, $buf, 1)); //每次讀一個(gè)字節(jié),直到文件最后
//讀取文件一行的函數(shù),文件句柄要加*號(hào)
my $line = readline(*FIN);
2.4 寫(xiě)文件
print filehandle ("$buffer")
:最常用的printf filehandle ("format", arg1, arg2, ..., argN)
:printf也是常用的
print FOUT ("#buffer");
write
:一種寫(xiě)法和printf相同,另一種用法與select()
函數(shù)搭配使用,可以省去 write 函數(shù)的 filehandle
select(FOUT);
write("num is %d\n", 50);
2.5 設(shè)當(dāng)讀寫(xiě)文件格式
binmode(filehandle)
:用來(lái)設(shè)定以二進(jìn)制方式讀寫(xiě)文件
2.6 使用范例
1、使用FIN,讀取文件一行,配合 while 循環(huán)就可讀取整個(gè)文件$_
:perl的內(nèi)置變量,默認(rèn)參數(shù)的意思,指的是在不指定的情況下,程序處理的上一個(gè)變量,在這里就是指的讀取文件的一行
my $line = "";
while(<FIN>){
$line .= $_;
}
2、使用FIN,一次性讀取整個(gè)文件$/
:輸入記錄分隔符,默認(rèn)是回車符\n
,<>尖括號(hào)就是通過(guò)識(shí)別回車符讀入一行??梢詫?duì)其進(jìn)行修改,但是建議是局部修改local,以免對(duì)其他地方產(chǎn)生影響。下面的代碼將其局部定義為未定義的變量,所以$file
變量就會(huì)一次性讀取所有內(nèi)容,因?yàn)闆](méi)有分隔符了。
open(FIN, "<file.lst");
{
local $/ = undef; //{}限定在局部作用域,不影響全局的$/
$file = <FIN>;
}
close(FIN);
//數(shù)組一次性讀入文件
my @array = <FIN>;
五、函數(shù)
sub
來(lái)定義函數(shù)@_
:存儲(chǔ)傳遞的實(shí)參shift(@_)
:彈出第一個(gè)參數(shù),數(shù)組元素-1,也可簡(jiǎn)寫(xiě)成 shift
返回值用關(guān)鍵字 return
,如果沒(méi)有關(guān)鍵字 return,函數(shù)會(huì)返回最后一個(gè)表達(dá)式的值。
sub add2 {
my $para1 = shift(@_);
my $para2 = shift(@_);
my $ret = $para1 + $para2;
return $ret;
}
my $val = add2(10,20); //函數(shù)定義在前調(diào)用在后
my $val = &add2(10,20); //函數(shù)調(diào)用在前定義在后
sub hello{
my $f1 = "@_"; //取所有的參數(shù)組成一個(gè)字符串,各個(gè)參數(shù)用‘ ’隔開(kāi)
my $f2 = @_; //取參數(shù)的個(gè)數(shù), 等同于scalar(@_)
my ($f3) = @_; //取第一個(gè)參數(shù)的值, 等同于 $_[0],或者寫(xiě)成my $f3 = shift(@_);
@w = @_; //復(fù)制整個(gè)數(shù)組
print "f1 is $f1\n";
print "f2 is $f2\n";
print "f3 is $f3\n";
}
hello(1,2,3);
f1 is 1 2 3
f2 is 3
f3 is 1
1、當(dāng)需要傳遞數(shù)組給一個(gè)函數(shù)時(shí),通常把數(shù)組的地址(指針)
作為參數(shù)進(jìn)行傳遞,用\符號(hào),再在函數(shù)里面恢復(fù)數(shù)組
sub add_arrary {
my $array_ref = shift; //把數(shù)組指針給這個(gè)標(biāo)量
my @myarray = @$array_ref; //根據(jù)地址還原出數(shù)組,用@符號(hào)
my $ret = 0;
foreach my $e (@myarray){
$ret += $e;
}
return $ret;
}
my @test_array = (1, 2 , 3 ,4, 5, 6, 7, 8, 9);
my $sum = add_array(\@test_array); //傳遞的是數(shù)組的指針,用\符號(hào)
2、函數(shù)變量的作用域
(1)一般只在函數(shù)內(nèi)有效
(2)在子函數(shù)內(nèi)部控制外面的變量,外面的變量就需要 local
定義
(3)在外面訪問(wèn)到子函數(shù)內(nèi)部的變量,即變量不會(huì)在函數(shù)調(diào)用完后消失時(shí),子函數(shù)內(nèi)部的變量用 our
定義文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-657054.html
練習(xí)題
1、perl腳本統(tǒng)計(jì)網(wǎng)表中cell類型和個(gè)數(shù)
#!/usr/bin/perl -w
use strict;
my %cells = (); //cell類型是字符串,所以要用哈希數(shù)組
open(FIN, "<digital_top_pr.v");
my $line;
while(<FIN>){
if($_ = ~ m/\s+(\w+)\s(\w+)\s(\./) { //這句沒(méi)看懂,可能就是提取cell
if(exits $cells{$1}){
$cells{$1} += 1;
}
else{
$cells{$1} = 1;
}
}
close(FIN);
foreach my $celltype (sort(keys %cells)){
print "$celltype : $cells{$celltype}\n";
}
2、回歸測(cè)試腳本
open和close要成對(duì)使用文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-657054.html
#!/usr/bin/perl -w
use strict;
open(CASE_LIST, "<tc.lst");
my @tc = <CASE_LIST>;
close(CASE_LIST);
open(REPORT, "">report.rpt);
foreach my $tc(@tc){
chmop($tc); //去除字符串行尾的換行符
my $res = run_test($tc);
if($res==0){
print REPORT "$tc:PASS\n";
}
else{
print REPORT "$tc:PASS\n"
}
}
close(REPORT);
到了這里,關(guān)于perl腳本語(yǔ)言學(xué)習(xí)1——基礎(chǔ)篇:變量、數(shù)組、哈希數(shù)組、循環(huán)、文件、函數(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!