Perl学习笔记(一)

第一章:概述

Q1:perl语言与C语言与JAVA语言的区别,它是面向对象的还是面向过程的?

答:perl是脚本语言,它不是面向过程的语言也不是面向对象的语言;因为它是脚本语言,所以它可以使用perl解释器直接解释执行,它不像系统程序设计语言是需要通过编译来执行;它没有main函数

 

Q2:perl语言可以用来做什么?不能用来做什么?

答:perl擅长用来处理文本;由于它是脚本语言,所以它的程序常以文本的形式存在,而不会编译成二进制代码;

 

Q3perl语言的开发环境是?如何编译并运行一个PERL程序?如何调试一个PERL程序?

答:脚本语言无专门的开发环境,常以文本文档来保存perl脚本,调试的方式不能像系统程序设计语言哪样可以设置断点之类的,脚本语言的调试只能通过输出信息的方式来实现调试。

 

Q4:perl作为脚本语言,一般嵌入在哪样的环境下执行呢?它的helloworld程序如何编写

答:它有点像shell脚本,在操作系统下(Unix)直接运行此脚本;

#! /usr/bin/perl

print“Hello,word!\n”;

 

第二章:标量数据

Q1:什么是标量?什么是变量?以及如何声明一个变量?

:perl是脚本语言,不能像C语言哪样,定义某一个变量的数据类型,它通过给予一个变量值来确定它是数字类型还是字符串类型,这里面变量的值就是标量;

PERL中声明一个变量用’ $’符号,如下例:

$fred= 17; #17 赋给变量$fred
$barney =‘hello’; #
将五个字母的字符串 ‘hello’赋给$barney

 

Q2perl输入与输出如何实现?给个实例

答:$line = <STDIN>;

 

Q3perl中的控制结构中的bool值如何给出?

答:通过比较运算符来给出,比如:

if($name gt ‘fred’ ){
print “ ‘$name’ comes after ‘ fred’ in sorted order.\n”;
}

 

 

Q4chomp,undef,defined分别有什么用?

答:chomp用来去掉字符串结尾的换行符,例如:

$text = “a line of text\n”; #也可以由<STDIN>输入
chomp($text); #
去掉换行符(\n)

Undef指的是变量未进行初始化之前的值是多少,它的值是undef,这么说它也是一种标量;

$madonna = undef ; #$madonna从未被初始化一样。

 

Defined就是用来断定这个变量的值是不是undef,也就是断定这个变量是否已经进行初始化,如果是undef,则Defined将返回false,比如:

$madonna = <STDIN>;
If ($defined ($madonna)){
print “The input was $madonna”;
}else{
print “No input available!\n”;
}

 

 

第三章:列表和数组

Q1perl如何声明数组以及进行数组初始化?如何对数组进行遍历?如何修改数组的值?

答:

[1]同变量声明一样,只需要在变量后面增加一个中括号便可以进行数组的声明,数组元素初始化与变量初始化一样,当然还可以使用列表‘qw’对数组进行批量初始化,也可以使用’@’进行批量初始化,比如下例:

$rocks[0],$rocks[1],$rocks[2],$rocks[3] = qw/talc mica feldsparquartz/;

@rocks = qw / bedrock slate lava /;
@tiny = (); #
空表
@giant = 1..1e5; #
包含 100 000 个元素的表
@stuff = (@giant, undef, @giant); #
包含 200001 个元素的表

[2]数组元素的增加与删除可以通过pop,push,shift,unshift函数来实现

@array = 5..9;
$fred = pop(@array); #$fred
得到 9 @array 现在为(5 6 7 8
$barney = pop @array; #$barney gets 8, @array
现在为( 5,6,7
pop @array; #@array
现在为( 5 6(7 被丢弃了)

 

push(@array,0); #@array 现在为(5,6,0)
push @array,8; #@array
现在为(5 6 0 8
push @array,1
..10; #@array 现在多了10 个元素
@others =qw/9 0 2 1 0 /;
push @array,@others; #@array
现在又多了 5 个元素(共有 19 个)

 

@array = qw# dino fred barney #;
$m = shift (@array); #$m
得到 “dino”, @array 现在为(“fred”, “barney”)
$n = shift @array; #$n
得到”fred”, @array 现在为“barney”
shift @array; #@array
现在为空
$o = shift @array; #$o
得到 undef, @arry 仍为空
unshift(@array,5); #@array
现在为( 5
unshift @array,4; #@array
现在为(4,5)
@others = 1..3;
unshift @array, @others; #array
现在为(1,2,3,4,5

 

[3]数组的遍历可以通过如下两种方式实现:

foreach $rock (qw/ bedrock slate lava /){
print “One rock is $rock.\n”; #
打印出 3 rocks
}

 

@rocks = qw/ bedrock slate lava /;
foreach $rocks(@rocks){
$rock = “\t$rock”; #@rocks
的每一个元素前加入一个 tab
$rock . = “\n”; #
每一个元素后加一个换行符
}
print “The rocks are:\n”,@rocks; #
每一个元素都被缩进了,并且一个元素占一行

 

 

 

Q2perl如何声明列表以及进行列表初始化?如何对列表进行遍历?如何修改列表的值?

答:列表的本质是标量,它无法独立存在,必须将其赋给数组;所以对列表的操作就是对数组的操作;

 

Q3:上下文是什么?如何体现一个上下文?为什么要用上下文?如果不用上下文有什么别的方式来代替?

答:上下文是指的表达式所在的语义环境,对于不同的语义环境,某个标量或者某个列表结果将不一样,它分为标量上下文以及数组上下文两类,其作用体现在,当列表变量转换给标量变量时,值如何取,以及当一个标量变量转换为一个列表变量时,值如何取,本质上其实就是一个类型转换问题,比如下例:

@people= qw( fred barney betty );

@sorted = sort @people; #列表contextbarney , betty, fred

$number= 42 + @people; #标量 context 42+3得到45

 

@list= @people; #3 People 的列表

$n =@people ; #数字3

 

Q4:如何得到一个列表的大小?

答:采用scalar函数,如下例所示:

@rocks= qw(talc quartz jade obsidian);
print “How many rocks do you have?\n”;
print “I have ”, @rocks, “rocks!\n”; #
错误,输出 rocks 的名字
print “I have ”, scalar @rocks, “rocks!\n”; #
正确,输出其数字

 

 

第四章:子程序

Q1:什么是子程序?它与函数的区别?如何声明一个子程序?如何调用一个子程序?如何向一个子程序进行传递参数?

答:子程序有点类似于函数,但它又不是完全的函数,函数在声明时会指定返回值的类型,而且可以用return关键字进行值的返回,而perl子程序无法指定返回值类型,它的声明也较简单,而且它的返回值也必须是子程序逻辑的最后一行;

下面展示一个子程序的声明:

submarine {
$n + = 1; #
全局变量$n
print “Hello, sailor number $n!\n”;
}

下面展示一个子程序如何调用:

&marine;#输出Hello, sailor number 1!
&marine; #
输出Hello, sailor number 2!
&marine; #
输出Hello, sailor number 3!
&marine; #
输出Hello, sailor number 4!

 

下面展示子程序如何返回值:

subsum_of_fred_and_barney{
print “Hey, you called the sum_of_fred_and_barney suroutine!\n”;
$fred + $barney; #
返回值
}

 

sublarger_of_fred_or_barney {

if($fred > $barney){

$fred;

}else{

$barney;

}

}

下面展示如何向一个子程序传递参数:

submax{
#
&larger_of_fred_or_barney 比较
If($_[0] > $_[1]){
$_[0];
}else{
$_[1];
}
}

 

$n =&max(10,15); #此子程序有 2 个参数

 

Q2perl如何在子程序内部定义一个私有变量?

答:

$maximum= &max(3,5,10,4,6);
sub max {
my($max_so_far) = shift @_;
foreach (@_){
if($_>$max_so_far){
$max_so_far=$_;
}
}
$max_so_far;
}

 

第五章:输入与输出

Q1:输入输出各有哪几种方式?怎么实现?

答:输入有两种方式,标准化输入,参数化输入,比如下面例子:

标准化输入:

 

while(defined($line = <STDIN>)) {
print “I saw $line”;
}

 

$./my_program fred barney betty

while(defined($line = <>)){
chomp($line);
print “It was &line that I saw!\n”;
}

 

输出有标准输出以及格式化输出两种方式:print,prinf

print(“Hello, world!\n”);

printf“Hello, %s; your password expires in %d days!\n”,
$user, $days_to_die; 
# Hello, meryn;your password expires in 3 days!

 

 

Q2:什么是句柄?什么是文件句柄?如何操作一个文件句柄?

答:句柄其实是打开一个连接,当PERL程序想操作硬件资源时,只能通过发送指令给操作系统来得到,一旦指令发送成功,与硬件资源建立成连接,则返回指向这个连接的一个引用,也就是句柄。如果请求的资源是文件,则为文件句柄。

 

 

 

Q3:什么是DIE

答:当Perl 内部发生了一个严重错误(fatal error)(例如,除数为0或者使用了无效的正则表达式,或者调用了一个未声明的函
)程序将停止运行,并告诉你失败的原因◆。可以利用die 函数来创建我们自己的严重错误,die 函数将打印出你给它的消息(利用标准错误流),并确保程序退出时为非零( nonzero的退出状态(exitstatus)。

die 还会为你做一件事:他会自动将Perl 程序的名字和行数◆输出在消息的末尾,因此能轻易的辨别出是哪一个die 引起的
错误。

 

第六章:哈希

Q1:什么是哈希,为什么要用哈希,如何使用哈希?

答:哈希其实是由键值对组成的数组。类似于主机名称与IP地址对应的应用需要用到键值对来操作;

哈希值的存取:

$family_name{“fred”}= “flintstone”;
$family_name{“barney”} = “rubble”;

 

整体赋值:

%some_hash= (“foo”, 35, “bar”, 12.4, 2.5, “hello”, “wilma”, 1.72e30, “betty”, “bye\n”);

@array_array= %some_hash;

%new_hash= %old_hash;

 

‘=>’操作:

my%last_name = (
“fred” => “flintstone”,
“dino” => undef,
“barney”=> “rubble”;
“betty”=> “rubble”,
);

 

哈希遍历:

如果想迭代hash 的每一个元素(如,检查每一个元素),一种通常的方法是使用each 函数,它将返回key/value 对的元素
列表

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

 

 

exists函数

要查看hash 中是否存在某个key(某人是否有借书卡),可以使用exists 函数,如果hash 中存在此key则返回true这和
是否有对应的value 无关:
if(exists$books{$dino}){
print
Hey,theresa libaray card for dino! \n;
}

delete函数
delete 函数将某个给定的 key包括其对应的 valuehash 中删除。(如果不存在这个 key,则什么也不做;不会有警告或者
错误信息。)
my $person = betty;
delete $books{$person}; #
$person 的借书卡删除掉
这和hash 中存储的为undef是不同的。使用exists($books{ betty})将给出相反的结果。使用delete 后,hash 中将不会存在
key如果其值是udnef key是存在的。
本例中,delete 和存储的值为undef 的不同点在于,前者是将Betty 的借书卡取走(删除)而后者是给她一张从没有用过的
借书卡

 

hash元素的内插
你可以在双引号的字符串中使用单个 hash 元素:
foreach $person(sort keys %books){

 

if($books{$person}){

print$personhas $books{$person} items\n #fred 有3
}
}
但不支持整个hash 的内插;%books”仅是六个不同的字符%books

 

◆。 你已经见过所有的在双引号中会被内插的特殊字符:
$ @ 可以使用反斜线 ( \ ) 得到这样的字符, 否则其会被内插。 其它字符都不会别内插, 会被照常输出◆
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值