Perl小小notes

函數名 opendir
調用語法 opendir DIRHANDLE,EXPR
解說 打開目錄EXPR,並將它與DIRHANDLE關聯進行處理,使用readdir函數

返回 | 0失敗,1成功 例子 |前端

函數名 readdir
調用語法 readdir DIRHANDLE
解說 從一個使用opendir打開的目錄句柄讀取目錄記錄也就是文件名

first line: #!\usr\bin\env perlpython

three values: scalar string array正則表達式

scalar variables:shell

$variable   #upper and lowcase letters are different
$fred=$fred+5     ==     $fred+=5

output with printexpress


###數組數組

  • 字符最後的空格能夠被識別
  • 雙引號必須加轉義符,單引號不用加

列表是包含在括號裏的一序列的值,能夠爲任何數值,也可爲空,如:(1, 5.3 , "hello" , 2),空列表:()。 列表存貯於數組變量中,與簡單變量不一樣,數組變量以字符"@"打頭,如: @array = (1, 2, 3);ruby

引用數組

$array[num] #因爲數組元素是簡單變量 數組變量和單變量能夠用一個名字,在變量與序號【num】之間加".","{}"和「\」能夠區分less

qw( fred barney betty wilma dino ) # same 「×××××」, but less typing函數

####pop和push pop將數組最後一個元素取出測試

%fred=pop(@array);
     %fred=pop  @array;
     pop @array

push與pop相反

push(@array,1);
     push @array,@array1;
     push @array 1..10;

shift和unshift操做數組首元素


###輸入 $name=<STDIN>;

在數組環境中,可把全部剩餘的行做爲一列表返回。如: @name=<STDIN>;

  • **chop()**函數,只是去除最後一個字符。

  • **chomp()**函數,就要首先判斷最後一個字符是否是爲"\n",它纔去除。

Perl不會解析單引號中的內容,可是會解析雙引號中的。

若是將變量放在單引號中,Perl僅僅會認爲它是用戶要顯示字符(\’和\除外的轉義字符也不會解析),可是若是將其放在雙引號的字符串裏,它將被解析爲一個變量。並且Perl還會解析變量字符串裏的特殊字符。

即便用單引號表示字符串時能夠不用\做爲轉義字符

Perl還提供了兩個函數因爲引用字符串:q和qq。q函數的功能和單引號相似,qq函數的功能和雙引號相似。這兩個函數的主要目的是使用戶在不用使用\’、\和\」等特殊字符的狀況下,就能在字符串中使用單雙引號。

反引號中的內容若是出現OS命令,該命令會被執行,而且結果數組會替換命令位置,或做爲賦值的數據,縮寫是qx/內容/

子程序定義和使用 1.先用後定義

&subname;
     sub subname{};

2.先定義能夠直接調用

sub subname{};
     subname;

3.先定義程序名,再定義程序體

sub subname;
     subname;
     sub subname{};

4.do==& 子程序參數傳遞

&sub1(&number1, $number2, $nubmer3);
     ---
     sub sub1{
          my($number1, $number2, $number3) = @_;
          ---
     }

local函數在建立全局變量的一個局部實例後便可將它傳遞給任何子例程並繼續進行局部初始賦值。運算符my以與local函數一樣的方法建立一次局部實例,然而,由my建立的局部實例不能傳遞給其它子例程,傳遞給子例程進行運算的將是全局值而非局部引用值。


@_和$_的含義

"@_"是默認的數組變量 是子函數中的默認參數列表 在子函數中直接shift; 就能夠從@_的前端彈出一個元素. 即 shift;==shift @_;

"$__"爲默認列表變量 默認模式匹配空間 s/.../.../;==$_=~s/.../.../;

defined函數:用來判斷一個標量或者其它量是不是undef的,也就是判斷該變量是不是被賦過值的 @ARGV:用戶從命令行獲得的全部參數


###文件操做 open(filevar,filename); 例如 open(FILE,"zq"); open(FILE, "..\zq\qq1");

讀,寫(>),添加(>>); open的返回用來測試文件是否打開成功,非零即成功 讀文件 $line=<MYFILE>;從文件中讀取一行數據存儲到簡單變量$line中並把文件指針向後移動一行 @array = <MYFILE>;把文件的所有內容讀入數組@array,文件的每一行(含回車符)爲@array的一個元素。

寫文件

open(OUTFILE,">filename");
 print OUTFIEL ("");

####錯誤處理 die函數 若是調用失敗函數會將字符串打印到STDDERR上,並以$!的當前值退出腳本 while (~=~) 表達式自己返回一個布爾值,而且語句獲得執行,賦值語句在任什麼時候候都會獲得執行!

split函數: 把字符串進行分割並把結果放入數組當中 @b=split(/:/,$a);

###harsh $harsh{$some_key};

數組能夠儲存數組元素, 數組能夠儲存哈希變量 仔細理解數組‘展開’的概念,與while循環有關 哈希的下標能夠參與運算,與數組變量相似 使用 %hash 來表示哈希總體

%hash = (key1,value1,key2,value2);
     %hash = (key1=>value1,
                       key2=>value2);

reverse 函數將keyvalue對換 keys 函數提取索引 values 函數提取哈希值

@a = keys %hash;
     @b = values %hash;

each函數返回兩個元素的序列

($key,$value)=%hash;
while( ($key,$value)=each %hash) {
       print 「$key => $value\n」;
     }

exists 函數肯定哈希值是否存在,**delete **函數刪除哈希值 插入函數沒有意義 特殊哈希值 %ENV 系統的環境變量,如 $ENV{PATH};

chomp($line=<STDIN>);     read the next line and chomp it
define函數     判斷是否爲 undef
while(<STDIN>){...}
while (defined($_=<STDIN>)){...}
while(defined($line=<>)){ chomp($line); ...}
while(<>){chomp(...}
@ARGV     the list of the innovation argument,能夠強行賦值
<>只能在程序中出現一次,也就是必須一次性從鍵盤輸入完命令

print 「 @ 」有空格,可是會有\n print @ 每空格,可是會有\n

格式化輸出函數printf: printf函數使用 say函數:等同於shell裏的echo,也等同於python裏的print,也等同於ruby裏的puts,在perl 5.10中方便? close filehandlie

<>能夠讀取命令行上的全部文件內容;若是沒有給出文件名稱,則能夠讀取標準輸出。


##pattern expression

\b 單詞的開頭或結尾處,也就是單詞的分界處。\b並不匹配這些單詞分隔字符中的任何一個,它只匹配一個位置

  • 一樣是元字符,不過它表明的不是字符,也不是位置,而是數量——它指定前邊的內容能夠連續重複使用任意次以使整個表達式獲得匹配。 . 連在一塊兒就意味着任意數量的不包含換行的字符 代碼 說明

. 匹配除換行符之外的任意字符

\w 匹配字母或數字或下劃線或漢字

\s 匹配任意的空白符

\d 匹配數字

\b 匹配單詞的開始或結束

^ 匹配字符串的開始

$ 匹配字符串的結束

好比一個網站若是要求你填寫的QQ號必須爲5位到12位數字時,可使用:^\d{5,12}$。

代碼/語法 說明

  • 重複零次或更屢次
  • 重複一次或更屢次

? 重複零次或一次

{n} 重複n次

{n,} 重複n次或更屢次

{n,m} 重複n到m次

用小括號來指定子表達式(也叫作分組)

代碼/語法 說明

\W 匹配任意不是字母,數字,下劃線,漢字的字符

\S 匹配任意不是空白符的字符

\D 匹配任意非數字的字符

\B 匹配不是單詞開頭或結束的位置

[^x] 匹配除了x之外的任意字符

[^aeiou] 匹配除了aeiou這幾個字母之外的任意字符

分類 代碼/語法 說明

捕獲 (exp) 匹配exp,並捕獲文本到自動命名的組裏

(?<name>exp)     匹配exp,並捕獲文本到名稱爲name的組裏,也能夠寫成(?'name'exp)

                  (?:exp)                匹配exp,不捕獲匹配的文本,也不給此分組分配組號

零寬斷言 (?=exp) 匹配exp前面的位置

(?<=exp)             匹配exp後面的位置

                  (?!exp)                 匹配後面跟的不是exp的位置

                  (?<!exp)               匹配前面不是exp的位置

註釋 (?#comment) 這種類型的分組不對正則表達式的處理產生任何影響,用於提供註釋讓人閱讀

代碼/語法 說明

*? 重複任意次,但儘量少重複

+? 重複1次或更屢次,但儘量少重複

?? 重複0次或1次,但儘量少重複

{n,m}? 重複n到m次,但儘量少重複

{n,}? 重複n次以上,但儘量少重複


##注意: ####好習慣: use strict; use warnings; my $a1;

在定義之中使用my確保用戶定義的變量不與同名全局變量衝突,它使後面的變量成爲一般語言所謂的local變量

$0 這個程式的執行名字

$n 這個程式的第n個參數值,n=1..9

$* 這個程式的全部參數,此選項參數可超過9個。

$# 這個程式的參數個數

$$ 這個程式的PID(腳本運行的當前進程ID號)

$! 執行上一個背景指令的PID(後臺運行的最後一個進程的進程ID號)

$? 執行上一個指令的返回值 (顯示最後命令的退出狀態。0表示沒有錯誤,其餘任何值代表有錯誤)

$- 顯示shell使用的當前選項,與set命令功能相同

$@ 跟$*相似,可是能夠看成數組用

判斷文件狀態 -op expr

-r(R)

readable

-w(W)

writable

-x(X)

execuable

-o(O)

owned

-e

exist

-z

null file

-s

~-z

-f

common file

-d

directory


錯誤: open使用錯誤 open(FILE,">../test_pl/test");

相關文章
相關標籤/搜索