Perl 语法
标量数据
perl 区分大小写;
如果标量变量没有进行初始化赋值,会有一个undef进行赋值;
数字
在perl内部并不存在整数值。perl总是以双精度浮点数保存并运算数据的
字符串
单引号不会识别反义字符,而双引号会进行识别
"." 是字符串操作符,进行字符串拼接
"hello" . "world"
"x" 小写字母x是字符串重复操作符。
值得注意的是重复操作符的左操作符必须是字符串类型,所以数字5在进行重复操作前,先转换为单字符"5"
"fred" x 3
5 x 3;
变量内插
变量内插也称之为双引号内插,因为它只会在双引号里起作用;
如果需要将美元符号放进双引号内的字符串,可以在它前面用反斜线转义,以避免它的特殊意义;
在内插值的后面紧接输出字母、数字、下划线时,需要加上花括号以避免歧义;
$what = "yes or no!";
$n = 3;
print "fred ate $n $whats.\n"; # 不是what而是$whats
print "fred ate $n ${what}s.\n"; # 现在是what变量值
| 比较 | 数值 | 字符串 |
|---|---|---|
| 相等 | == | eq |
| 不等 | != | ne |
| 小于 | < | lt |
| > | gt | |
| <= | le | |
| >= | ge |
perl没有布尔类型
隐藏规则:
字符串'0'和数字0是同一个标量,所以perl会将他们一视同仁,也就是字符串'0'是唯一一个被当成假的非空字符串。
获取用户输入
<STDIN>或<stdin>
chmop
移除字符串的结尾的换行符:常见用法
chmop($text = <stdin>);
defined函数
defined函数用于判断参数是否为undef,如果是则为false,如果不是则为true;
我在测试使用的时候,有一个需要注意的点需:perl没有布尔值,因此,如果将这个函数返回给变量,这个变量没有值;
$i = defined(undef);# i没有值,不是以为的0;
$i = defined("");# 是以为的1?;
perl惯例:除非去掉括号会改变表达式的意义,否则括号用不用都可以。
数组
perl语言中是数组的起始索引是以0开始的,不过似乎在perl语言中可以更改所引致的的起始编号;
数组的最后一个索引值是$#rocks,但是这个数字比数组元素少1,因为还有一个索引值0;但同样的可以使用[-1]进行表示最后一个值;
与其他语言不同的是,数组在初始化时,使用的是圆括号而不是中括号,例如这样的:
(1,2,3)
范围操作符".."
(1..100)通过一个范围操作符创建了1到100的数组。范围操作符会向上进行逐次+1,;
例如这样的(5..1)是一个空数组,首位和末尾同样都是空;
qw
qw(fred barney betty wilma dino ) #等价于
("fred", "barney", "betty", "wilma", "dino")
在qw构建的数组中,不能像双引号内的字符串一样使用\n或$var变量
列表的赋值
($fred, $barney, $dino) = ("flintstone", "rubble", undef);
@rocks = qw/ bedrock slate lava /;
foreach $rock(@rocks) {
$rock = "\t$rock";
$rock .= "\n";
}
定界符
上面的例子中圆括号是作为定界符存在的的,perl还允许你使用任何标点符号作为定界符。
qw! fred baryney betty wilma dino !等;
reverse操作符
读取列表的值,返回相反的次序。reverse并不会修改参数;
sort操作符
按照ACSII编码进行排序操作;
特殊的变量$_
perl中的默认变量,在没有告知perl使用哪个参数的情况下,perl都会自动使用$_;
$_ " yabba dabab";
print;
强制指定标量上下文 scalar
@rocks = qw( talc quartz jade obsidian );
print "how many rocks do you have?\n";
print "I have ", @rocks, "rocks!\n";
print "I have ", scalar @rocks, " rocks!\n";
语句
循环语句
while
foreach
函数
在perl中将用户自定义的函数称之为subroutines子程序;
子程序可以在程序中的任何位置。在任何情况下多都不需要进行时事先声明。子程序的定义是全局的,你可以在子程序中使用任何的变量。
定义子程序sub
sub marine {
$n += 1;
print "Hello, sailor number $n!\n";
}
调用子程序
可以在任何表达式中使用子程序名(前面加上"&")来调用它;
&marine;
返回值
子程序被调用时一定是作为表达式的某个部分,即使该表达式的求值结果不会被调用;
在perl中,所有的子程序都有一个返回值————子程序并没有“有返回值”和“没有返回值”之分。但并不是所有的perl子程序都包含的返回值;
在perl中,不需要return指定返回值;在子程序的执行过程中,它会不断进行运算,而最后一次运算的结果,不管是什么,都会被自动当成子程序的返回值;
sub sum {
print "hi, you called the sum!";
$fred + $barney; #这个就是返回值
}
$fred = 3;
$barney = 4;
$wilma = ∑
print $wilma . "\n";
$betty = 3 * ∑
print $betty;
如果最后一行是print语句,它的返回值通常是1,代表输出成功;
参数
perl子程序可以有参数。要传递参数列表道子程序里,只要在子程序调用的后面加上括号所表示的列表表达式
$n = &max(10, 15);
perl会自动将参数列表化为特殊的数组变量@,该变量在子程序执行期间有效。子程序可以访问这个参数,以判断参数的个数以及参数的值;第一个参数存储在$[0];
$_与$_[]毫无关联,是两个独立的变量
参数列表@_
perl会自动将参数列表化名为特殊的数组变量@_,该变量在子程序执行期间有效。子程序可以访问这个数组,以判断参数的个数以及参数的值;
子程序中的私有变量
默认情况下,perl中所有的变量都是全局变量。在程序里的任何地方都可以访问它们。
my创建私有的词法变量
sub max {
my($m, $n);
($m, $n) = @_;
if($m > $n) {
$m
}else {
$n
}}
别的程序代码也都无法访问或修改这些私有变量,不管是无心或是有意的。所以,我们可以把这个子程序放进世界上任何一个perl程序里,且不用担心与那个程序中的$m和$n变量冲突。
perl允许你省略语句块中最后一个分号,但实际上,只有程序代码简单到整个语句块只有一行是,才有必要省略分号。
词法变量my可以uiys使用在任何块内,而不仅限于子程序的语句块。例如if, while, foreach的语句块中使用:
foreach(1..10){
my($square) = $_ *$_;
print "$_ square is $square.\n";
}
省略&
perl在调用子程序时,如果在调用子程序之前看到了子程序的定义,或则perl可以从语法识别它是子程序调用,那么该子程序就可以像内置函数那样,省略&;
但是如果自定义的子程序和内置函数同名,就必须使用&,否则会调用到内置函数;
持久性私有变量state
因为词法变量my所声明的变量会在语句块结束的时候,被销毁;
而用state操作符声明的变量弥补了my的调用一次后销毁的缺陷,并且state声明的变量的作用域和my一样;
用state声明的变量,是perl子程序的私有变量,并且在子程序的多次调用间保留该变量的值;
use 5.26.1;
sum(5,6);
sum(1..3);
sum(4);
sub sum {
state $sum = 0;
state @numbers;
foreach my $number(@_) {
push @numbers, $number;
$sum += $number;
}
say "the sum of (@numbers) is $sum";
}
}
return 操作符
只有返回发生在子程序中最后一行代码之前的时候,才需要使用return;
输入与输出
读取标准输入
钻石操作符<>
<>是行输入的特例,它并不是从键盘取的输入,而是从用户指定的位置读取;
while (defined($line = <>)) {
chomp($line);
print "It was $line that I saw!\n";
}
参数@ARGV数组
这个数组是由perl解释器事先建立的特殊素组,其内容就是由调用参数组成的列表。
输出
prnitf
文件句柄
文件句柄的命名和其他标识符一样,不过一般使用大写;
特殊文件句柄:<STDIN>, <STDOUT>, <STDEER>, DATA, ARGV, ARGVOUT
打开文件句柄
当你需要其他的文件句柄时,请使用open操作符告诉perl:
open CONFIG, "dino";
open CONFIG, "<dino";
open BEDROCK, ">fred";
open LOG, ">>logfile";
关闭文件句柄 close
改变默认的文件句柄 select
一旦select了默认输出的文件句柄,程序就会一直往那里输出。但是,这么做很容易使余下的程序变得混淆,所以这并不是一个好办法。因此,当你所指定的文件句柄使用完毕之后,最好把它设置为原先的默认值。
perl只有在成功打开新的的句柄连接时,才会关闭默认的系统文件句柄。
立刻刷新缓存区$|
将数据输出到文件句柄时,默认情况下都会经过缓冲的处理。不过,只要将特殊变量$|设定为1,就会使当前的默认文件句柄在每次输出操作后,立刻刷新缓冲区。
die函数
die会终结程序的运行,并且告诉我们无法创建日志文件。
$!可读系统出错信息
访问哈希元素
$hash{$some_key}
访问哈希%
用%表示哈希;
%some = {"foo", 35, "bar", 12.4, 2.5, "hello", "wilma", 1.72e30, "betty", "bye\n"};
@any = %some;
print "@any\n";
=>
为了区别键值;
my %last = (
"fred" => "flintstone";
"dino" => undef;
"barney" => "rubble",
"betty" => "rubble",
)
keys函数和 values函数
keys函数返回哈希的键列表,而values函数能返回值列表;
perl存储哈希的顺序无法预测,但是可以确定返回的键列表和值列表是一样的。
each函数
while(($key, $value) = each %hash) {
print "$key => $value\n";
}
each函数返回键值顺序是乱的;
exsits函数
检查哈希中是否有某个值,可以使用exists函数,它返回的真假;
delete函数
从哈希中删除指定的键和值,如果没有直接结束,不会出现任何的警告和错误;
%ENV哈希
获取环境变量
print "PATH is $ENV{PATH}\n";
# 艹,数据又丢了,不写了!!!!!!!

浙公网安备 33010602011771号