7C00.ME/houmu 2013-04-30

Perl笔记

原来写的一些笔记太零散,现在合并起来。

为什么要学习Perl?我在用Shell写一些脚本的过程中经常用到grep,grep支持的正则表达式种类很多,而我看到用到比较多的是Perl的正则表达式,即grep -P,便想去学习一下Perl的正则表达式语法,进一步想去学一下Perl编程语言。

这篇文章(和之后的一些文章)只是记录《Perl语言入门》阅读过程中的一些笔记,各段落之间不一定有联系。我阅读的这本书的第四版,用的是网上分享的一个[pdf](http://pan.baidu.com/share/link?shareid=449316&uk=2097829571 “”),下文的书页都是这个pdf里面的书页。

Page 10 联系题在每章的末尾。由于我们三人向几千人介绍相同的材料。因此我们仔细的选择了这些习题,让你更有机会犯错。

并不是我们希望你犯错,而是你需要这种经验。因为在Perl 生涯中,这些是你最可能犯的错误,因此我们现在就应当提醒你。那些在阅读本书时犯的错误,可能不会在项目的终止日期时重犯。当你出错是我们会帮助你找到错误的原因;附录A 有每一个习题的解答,和小段注释。当完成习题时请检查答案。

不要在仔细尝试之前看答案。自己解决比读解答学的更牢靠。如果没有找到答案,也不要太伤心。继续阅读下一章。如果你完全没有犯错误,也因当在完成时看下答案。解答的注释中可能有关于这段程序的一些不明显地方的介绍。

Page 11 实际上懒惰是一种美德。手推车是由那些懒于搬东西的人发明的;文字是由那么懒于记忆的人发明的。Perl是由那些不创造一种新的语言就懒于完成任务的人发明的。

Perl中分号不是可选的,这点不太习惯。

Perl中的数值

Perl中的字符串

Perl中的警告

开启方式有以下几种:

1 增加命令行选项

$perl -w program.pl

2 在perl脚本开头增加选项

#!/usr/bin/perl -w

#!perl -w

3 使用progma,要求Perl版本在5.6及以上

#!/usr/bin/perl
using warnings;

或使用诊断:

#!/usr/bin/perl
using diagnostics;

Perl中的标量变量

和PHP中的变量基本相同。使用$前缀,下划线或字母作为首字符,严格区分大小写(PHP中好像不区分大小写),支持赋值(=)、二元赋值(+=、*=、.=等)、比较(>、<、>=、<=、==、!=及gt、lt、ge、le、eq、ne)等操作,运算符优先级同C语言。

Perl中的控制语句

if 语句:

if( cond ) {
	#statement; 
}

if( cond ) {
	# statement1; 
} else {
	# statement2;
}

while语句:

while( cond ) { 
	#statement; 
}

读取用户输入

使用 $line = <STDNIN> ,或 chomp( $line = <STDIN>),去掉换行符。

undef和defined

未赋值变量的值为undef,根据需要可以自动初始化为数值0或空字符串。用defined($var)来判断是否赋值过。

Perl中哈希指的是一种数据结构,和其他语言中的map、dictionary是相似的概念。之所以叫做哈希是因为内部实现使用了哈希表,而通常哈希作为一种加密相关的函数或这个函数输出的字符串,所以应该换个名字,比如叫做哈希表。

###哈希操作

###哈希和列表

%hash1=("foo", 35, 2.5, "hello"); #list to hash
# $hash1["foo"] = 35; $hash1[2.5] = "hello";
@list1=%hash1; #hash to list
# @list1=qw/foo 35 2.5 hello/;(顺序不一定这样)

###哈希函数

my %hash=('a'=>1, 'b'=>2, 'c'=>3)
my @ks=keys %hash;     # @ks=qw/a b c/;
my @vs=values %hash;   # @vs=qw/1 2 3/;
my $count=keys %hash;  # $count=3;

# 遍历
while(($k, $v) = each %hash){
    print "$k => $v\n";
}

# 对键排序后遍历
foreach $key(sort keys %hash){
    print "$key => $hash{$key}\n";
}

Title: Perl笔记:print和list Date: 2013-05-01 0:28 Tags: perl

Perl中有趣的一个特性就是Context。对于列表打印的方式不同,结果也不同,如下代码:

#!/usr/bin/env perl

@inputs=qw/fred barney wilma betty/;

print @inputs;
print "\n";

print "@inputs";
print "\n";

输出结果是

fredbarneywilmabetty
fred barney wilma betty

目前的理解是,第一处print列表, @inputs 转化为标量字符串,第二次print列表,则是字符串内插转化。不过,还是有些不清楚。

正则表达式

while(<>){
    if(/fred/){
	print;
    }
}

m//, m{}, m%%, m(), etc, 常用m{}

二维数组

my @a2 = ([1, 2], [2,4], [3, 9]);
push @a2, [4, 16];
for(@a2){
    print "@{$_}";
}