十分鐘學(xué)perl夠用(客服MM都懂了)

2018-09-06 18:02 更新
零基礎(chǔ),perl語(yǔ)言,10分鐘入門(mén)

1.Hello,World

#!/usr/bin/perl -w
print ("hello,world!\n");
#print "hello,world!\n"; 

說(shuō)明:

(1)第一行指定解釋器,-w參數(shù)表示提示警告(或者使用use strict命令,執(zhí)行更嚴(yán)格的檢查);

(2)第二行輸出hello, world!;

(3)如果習(xí)慣c的函數(shù)方式,print的參數(shù)可以打括號(hào);

(4)第三行是注釋?zhuān)⑨屢?打頭;

(5)如果習(xí)慣shell的方式,print的參數(shù)可以沒(méi)有括號(hào);

(6)雙引號(hào)內(nèi)可以使用轉(zhuǎn)義字符;

不妨設(shè)文件名為helloworld.pm

程序的執(zhí)行方法為:

(1)perl helloworld.pm

(2)chmod 755 helloworld.pm && ./helloworld.pm


2.常量

2.1數(shù)字

(1)Perl內(nèi)部總按照“雙精度浮點(diǎn)數(shù)”保存數(shù)字并執(zhí)行運(yùn)算;

(2)0377=>八進(jìn)制;0xFF=>十六進(jìn)制;

2.2字符串

(1)單引號(hào)表示字符串,不轉(zhuǎn)義;

(2)雙引號(hào)表示字符串,轉(zhuǎn)義且解釋變量;

2.3字符串操作符

(1)拼接操作符:“.”=>拼接字符串;

(2)重復(fù)操作符:“x”=>一個(gè)字符串重復(fù)多次;

#!/usr/bin/perl -w
print ("hello,"."world!\n");
print ("hello " x 3);

輸出結(jié)果是:

hello,world!

hello hello hello

最后要說(shuō)明一點(diǎn),Perl是弱類(lèi)型語(yǔ)言,字符串和數(shù)字會(huì)相互轉(zhuǎn)化,這一點(diǎn)和php一樣。


3.變量

(1)變量以$開(kāi)頭,后接一個(gè)標(biāo)示符;

(2)如何用變量獲取用戶(hù)輸入?

使用,它獲取用戶(hù)的輸入(一般以換行結(jié)束),可以使用chomp去除結(jié)尾的換行符。

#!/usr/bin/perl -w
$count = 0;
while($count<10)
{
chomp($input = );
print($input);
$count++;
} 

(3)未定義變量

未定義的變量會(huì)賦予undef值,它既不是數(shù)字,也不是字符串;

它有可能被當(dāng)做數(shù)字0使用;

使用define函數(shù)可以知道一個(gè)變量是否被定義;

#!/usr/bin/perl -w
$var = undef;
print($var);
if(defined($var))
{
print("defined!\n");
}
else
{
print("undefined!\n");
}
$var++;
print($var);

它的輸出是:

Use of uninitialized value in print at undef.pm line 3.

undefined!

1


(4)變量的作用域

my和our可以指定變量的作用域

my指定為局部作用域;

our指定為全局作用域(默認(rèn)為our);

#!/usr/bin/perl -w
our $g_one = "global_one\n";
$g_two = "global_two\n";
{
my $local_one = "local_one\n";
print($g_one);
print($g_two);
print($local_one);
}
print($g_one);
print($g_two);
print($local_one); 

輸出為:

global_one

global_two

local_one

global_one

global_two

Use of uninitialized value in print at our_my.pm line 13.


4.數(shù)組與列表

4.1數(shù)組

和c的數(shù)組使用非常類(lèi)似:

$array[0]=”a0″;

$array[1]=”a1″;

$array[2]=”a2″;


4.2列表

圓括號(hào)內(nèi)的一系列值,構(gòu)成列表:

(1, 2, 3)

(“hello”, 4)

(“hello”, “world”, “yes”, “no”)

qw(hello world yes no)

(1..10)

說(shuō)明:

(1)第一行,列表元素為1,2,3;

(2)第二行,列表元素為一個(gè)字符串,一個(gè)數(shù)字;

(3)第三行,列表元素為4個(gè)字符串,好多引號(hào)和逗號(hào)??;

(4)第四行,wq操作符,用來(lái)建立字符串列表,而不用輸入這么多引號(hào)和逗號(hào),效果同(3);

(5)范圍操作符“..”,表示一個(gè)范圍,從左至右連續(xù)加一。

列表的賦值:

($v1, $v2, $v3) = qw(yes i am);

整個(gè)列表的引用,@操作符:

@list = qw(yes i am);

@none = ();

@huge = (1..5);

@stuff = (@list, @none, @huge);

pop和push操作符:

(1)pop彈出列表末端元素;

(2)push向列表末端壓入元素;

shift和unshift操作符:

(1)shift移出列表首部元素;

(2)unshift向列表首部壓入元素;

列表的輸出:

(1)列表輸出,只輸出列表,元素間不含空格;

(2)列表的字符串化輸出,輸出列表,元素間加入空格;

(3)foreach控制結(jié)果,可以依次取得列表中各個(gè)元素

#!/usr/bin/perl -w
@list = qw(yes i am);
@none = ();
@huge = (1..5);
@stuff = (@list, @none, @huge);
$pop_last = pop(@stuff);
print($pop_last);
push(@stuff, "hello");
$shift_first = shift(@stuff);
print($shift_first);
unshift(@stuff, "world");
print(@stuff);
print("@stuff");
$element=undef;
foreach $element (@stuff)
{
print("$element!\n");
} 
輸出:
5
yes
worldiam1234hello
world i am 1 2 3 4 hello
i!
am!
1!
2!
3!
4!
hello!

4.3默認(rèn)變量$_

該使用變量的地方,如果省略變量,則會(huì)使用默認(rèn)變量$_。

#!/usr/bin/perl -w
$_="hello,world!";
print(); 
輸出是:
hello,world!

5.函數(shù)

5.1函數(shù)定義與調(diào)用

(1)定義函數(shù)的關(guān)鍵字是sub;

(2)函數(shù)調(diào)用的關(guān)鍵字是&;

(3)可用return顯示返回,也可用一個(gè)數(shù)字隱式返回

#!/usr/bin/perl
$num=0;
sub sumAdd
{
$num+=1;
print("$num\n");
#return $num; # 顯示返回
$num; # 隱式返回
}
&sumAdd;
&sumAdd;
print(&sumAdd); 
執(zhí)行結(jié)果為:
1
2
3
3

5.2函數(shù)的參數(shù)

(1)調(diào)用函數(shù)時(shí)可直接帶參數(shù)列表;

(2)函數(shù)定義處使用“默認(rèn)變量”獲取參數(shù)列表;

#!/usr/bin/perl -w
sub max
{
return ($_[0]>$_[1]?$_[0]:$_[1]);
}
$big=20;
$small=10;
print(&max($big,$small)); 
輸出為:
20

6.程序輸入輸出

上文已經(jīng)介紹過(guò)標(biāo)準(zhǔn)輸入,下面介紹其他幾種常見(jiàn)的輸入輸出。

6.1Unix工具輸入輸出:<>

<>提供類(lèi)似于Unix工具輸入輸出的功能,它提供的功能能夠很好的和cat/sed/awk/sort/grep等工具結(jié)合使用。

#!/usr/bin/perl -w
use strict;
while(<>)
{
chomp();
print("$_!!!\n");
} 

該腳本的功能,是在輸入每行后面加上!!!,它幾處使用到了默認(rèn)變量。

不妨設(shè)文件名為diamond.pm

不妨設(shè)hello.txt中有三行數(shù)據(jù),分別是111,222,333

執(zhí)行步驟:

(1)chmod 755 diamond.pm

(2)cat hello.txt | ./diamond.pm | cat

輸出結(jié)果:

111!!!
222!!!
333!!!

6.2格式化輸出:printf
#!/usr/bin/perl -w
$int_var = 2011;
$str_var = "hello,world";
printf("%d\n%s\n",$int_var,$str_var);
輸出結(jié)果為:
2011
hello,world

6.3文件輸入輸出

Perl保留了6個(gè)文件句柄:STDIN/STDOUT/STDERR/DATA/ARGV/ARGVOUT

上述6.1中的程序還能這么執(zhí)行:

./diamond.pm out.txt

則輸出結(jié)果會(huì)重定向到out.txt中

輸入輸出到文件中中,需要打開(kāi)、使用、關(guān)閉文件句柄

(1)打開(kāi)文件句柄:

open LOG, “>>log.txt”;

open CONFIG, ” 

(2)關(guān)閉文件句柄:

close LOG;

close CONFIG;

(3)使用文件句柄:

print LOG (“hello,world!\n”);

print STDERR (“yes i am!\n”);

while()

{

chomp();

}

也可以使用select關(guān)鍵字:

print(“to stdout1!”);

select LOG;

print(“to log1″);

print(“to log2″);

select STDOUT;

print(“to stdout2!”);

#!/usr/bin/perl -w
$input_file = "hello.txt";
$output_file = "out.txt";
open INPUT, "<$input_file"; open OUTPUT, ">>$output_file";
while(
<input type="text">)
{
chomp();
print OUTPUT ("$_!!!\n");
}
close OUTPUT;
close INPUT; 
說(shuō)明:他的功能和之前的diamond.pm是一樣的。

7.哈希hash

7.1哈希的存取

$key=”am”;

$hash_one{“yes”} = 3;

$hash_one{“i”} = 1;

$hash_one{$key} = 5;

print($hash_one{“am”});

$value = $hash_one{“hello”}; # undef


7.2哈希的引用

要引用整個(gè)哈希,使用%操作符。

%hash_one = (“hello”,5,”world”,5);

print ($hash_one{“hello”});

%hash_two = %hash_one;


7.3哈希的松綁

哈??梢赞D(zhuǎn)化為鍵值列表,稱(chēng)為哈希的松綁,轉(zhuǎn)化后不保證鍵的順序,但值一定在鍵的后面。

#!/usr/bin/perl -w
$input_file = "hello.txt";
$output_file = "out.txt";
open INPUT, "<$input_file"; open OUTPUT, ">>$output_file";
while(
<input type="text">)
{
chomp();
print OUTPUT ("$_!!!\n");
}
close OUTPUT;
close INPUT; 
輸出結(jié)果為:
5
yes 3 am 2 hello 5 world 5 i 1


7.4哈希的反轉(zhuǎn)

建立值對(duì)應(yīng)鍵的反轉(zhuǎn)哈希。

%hash_reverse = reverse(%hash_one);

只有在鍵值一一對(duì)應(yīng)的情況下才湊效,否則會(huì)有無(wú)法預(yù)期的覆蓋發(fā)生。


7.5哈希的美觀賦值

哈希的美觀賦值使用=>符號(hào)。

%hash_one = (“hello”,5,”world”,5,”yes”,3,”i”,1,”am”,2);

上面這種賦值方式很容易搞錯(cuò),特別是鍵值都是字符串的時(shí)候。

%hash_one = (
“hello” => 5,
“world” => 5,
“yes” => 3,
“i” => 1,
“am” => 2,

);

美觀賦值,是不是看起來(lái)更美觀,更容易區(qū)分哈什的鍵值呢。


7.6哈希的遍歷

(1)keys和values函數(shù)能返回所有鍵與值的列表,但列表內(nèi)順序不保證。

@k = keys(%hash_one);

@v = values(%hash_one);


(2)each函數(shù)能一一遍歷哈希,返回鍵值對(duì),非常適合于while等循環(huán);

while(($key, $value) = each(%hash_one))

{

}


示例代碼:
#!/usr/bin/perl -w
%hash_one = (
"hello" => 5,
"world" => 5,
"yes" => 3,
"i" => 1,
"am" => 2,
);
@k = keys(%hash_one);
@v = values(%hash_one);
print("@k\n");
print("@v\n");
$key = undef;
$value = undef;
while(($key, $value) = each(%hash_one))
{
print("$key=>$value\n");
} 

輸出結(jié)果為:
yes am hello world i
3 2 5 5 1
yes=>3
am=>2
hello=>5
world=>5
i=>1

7.7哈希的查詢(xún)與刪除

(1)查詢(xún)一個(gè)鍵是否存在,使用exists函數(shù);

(2)刪除一個(gè)鍵,使用delete函數(shù);

#!/usr/bin/perl -w
%hash_one=(
"yes" => 3,
"i" => 1,
"am" => 2,
);
delete($hash_one{"yes"});
if(exists($hash_one{"yes"}))
{
print($hash_one{"yes"});
} 
結(jié)果什么也不輸出。

8.流程控制*(本節(jié)可跳過(guò),都是些花哨的用法)

除了各語(yǔ)言常用的if/esle,for,while等流程控制外,Perl還有一些特有的控制語(yǔ)句,更人性化。

(1)unless控制結(jié)構(gòu)

作用效果類(lèi)似于if not,無(wú)效率上提升,只是使表達(dá)更自然,代碼更容易理解。

(2)until控制結(jié)構(gòu)

作用效果類(lèi)似于while not

(3)條件修飾

判斷條件可以直接寫(xiě)在語(yǔ)句的后面,以增加可讀性(habadog注:這是鬼扯)。

print (“$n”) if $n < 0; $i *= 2 until $i > 1024;

&sumAdd($_) foreach @num_list;

(4)裸控制結(jié)構(gòu)

只有一個(gè)花括號(hào)的結(jié)構(gòu),往往用來(lái)限制作用域,在各語(yǔ)言中都很常見(jiàn)。

{

$a = 1;

}

# $a失效了

(5)last控制結(jié)構(gòu)

相當(dāng)于c中的break,立刻終止循環(huán);

(6)next控制結(jié)構(gòu)

相當(dāng)于c中的continue,立刻開(kāi)始下一次循環(huán);

(7)redo控制結(jié)構(gòu)

…獨(dú)有的,重新開(kāi)始本次循環(huán);

while(1)

{

# 跳到這里

print (“hello”);

redo;

}


9.高級(jí)特性

神奇的Perl還有正則、module、文件、字符串、智能匹配、進(jìn)程管理、線程支持等高級(jí)特性,就不在入門(mén)手冊(cè)里介紹了。

如果大伙喜歡,后續(xù)發(fā)布以上特性的手冊(cè)。


希望你喜歡上Perl。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)