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 = &sum;
print $wilma . "\n";
$betty = 3 * &sum;
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解释器事先建立的特殊素组,其内容就是由调用参数组成的列表。

输出

print

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";


# 艹,数据又丢了,不写了!!!!!!!
posted @ 2021-09-29 20:48  no_no  阅读(83)  评论(0)    收藏  举报