Perl语言简述

news/2024/12/13 2:30:21/

1.Hello,World

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

说明:

(1)第一行指定解释器,-w参数表示提示警告(或者使用use strict命令,执行 更严格的检查);
(2)第二行输出hello,world!;
(3)如果习惯c的函数方式,print的参数可以打括号;
(4)第三行是注释,注释以#打头;
(5)如果习惯shell的方式,print的参数可以没有括号; (6)双引号内可以使用转义字符;

不妨设文件名为helloworld.pm
程序的执行方法为:

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

2.常量
2.1数字

1)Perl内部总按照“双精度浮点数”保存数字并执行运算;
(20377=>八进制;0xFF=>十六进制;

2.2字符串

1)单引号表示字符串,不转义;
(2)双引号表示字符串,转义且解释变量;

2.3字符串操作符

1)拼接操作符:“.=>拼接字符串;
(2)重复操作符:“x”=>一个字符串重复多次;
#!/usr/bin/perl -w
print  ( "hello," . "world!\n" );
print  ( "hello "  x 3);
输出结果是:
hello,world!
hello hello hello

最后要说明一点,Perl是弱类型语言,字符串和数字会相互转化,这一点和php一样。

3.变量

1)变量以$开头,后接一个标示符;
(2)如何用变量获取用户输入?

使用,它获取用户的输入(一般以换行结束),可以使用chomp去除结尾的换行符。

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

(3)未定义变量
未定义的变量会赋予undef值,它既不是数字,也不是字符串;
它有可能被当做数字0使用;
使用define函数可以知道一个变量是否被定义;

#!/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!

(4)变量的作用域
my和our可以指定变量的作用域
my指定为局部作用域;
our指定为全局作用域(默认为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.数组与列表
4.1数组

和c的数组使用非常类似:

$array[0]=”a0″;
$array[1]=”a1″;
$array[2]=”a2″;

4.2列表
圆括号内的一系列值,构成列表:

(1, 2, 3)
(“hello”, 4)
(“hello”, “world”, “yes”, “no”)
qw(hello world yes no)
(1..10)
说明:
(1)第一行,列表元素为1,2,3;
(2)第二行,列表元素为一个字符串,一个数字;
(3)第三行,列表元素为4个字符串,好多引号和逗号啊;
(4)第四行,wq操作符,用来建立字符串列表,而不用输入这么多引号和逗号,效果同(3);

(5)范围操作符“…”,表示一个范围,从左至右连续加一。

列表的赋值:
($v1, $v2, $v3) = qw(yes i am);整个列表的引用,@操作符:
@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控制结果,可以依次取得列表中各个元素

#!/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默认变量 ∗ ∗ 该使用变量的地方,如果省略变量,则会使用默认变量 _** 该使用变量的地方,如果省略变量,则会使用默认变量 该使用变量的地方,如果省略变量,则会使用默认变量_。

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

5.函数
5.1函数定义与调用

(1)定义函数的关键字是sub;
(2)函数调用的关键字是&;
(3)可用return显示返回,也可用一个数字隐式返回

#!/usr/bin/perl
$num =0;
sub  sumAdd
{
$num +=1;
print ( "$num\n" );
#return $num; # 显示返回
$num ;  # 隐式返回
}
&sumAdd;
&sumAdd;
print (&sumAdd);
执行结果为:
1
2
3
3

5.2函数的参数
(1)调用函数时可直接带参数列表;
(2)函数定义处使用“默认变量”获取参数列表;

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

6.程序输入输出
上文已经介绍过标准输入,下面介绍其他几种常见的输入输出。
6.1Unix工具输入输出:
提供类似于Unix工具输入输出的功能,它提供的功能能够很好的和cat/sed/awk/sort/grep等工具结合使用。

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

该脚本的功能,是在输入每行后面加上!!!,它几处使用到了默认变量。
不妨设文件名为diamond.pm
不妨设hello.txt中有三行数据,分别是111,222,333
执行步骤:

1)chmod 755 diamond.pm
(2)cat hello.txt | ./diamond.pm | cat
输出结果:
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 );
输出结果为:
2011
hello,world

6.3文件输入输出
Perl保留了6个文件句柄:STDIN/STDOUT/STDERR/DATA/ARGV/ARGVOUT
上述6.1中的程序还能这么执行:
./diamond.pm out.txt
则输出结果会重定向到out.txt中

输入输出到文件中中,需要打开、使用、关闭文件句柄

1)打开文件句柄:
open LOG,>>log.txt”;
open CONFIG, ” (2)关闭文件句柄:
close LOG;
close CONFIG;3)使用文件句柄:
print LOG (“hello,world!\n”);
print STDERR (“yes i am!\n”);
while()
{
chomp();}也可以使用select关键字:
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;

说明:他的功能和之前的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哈希的引用

要引用整个哈希,使用%操作符。
%hash_one = (“hello”,5,”world”,5);
print ($hash_one{“hello”});
%hash_two = %hash_one;

7.3哈希的松绑
哈希可以转化为键值列表,称为哈希的松绑,转化后不保证键的顺序,但值一定在键的后面。

#!/usr/bin/perl -w
%hash_one  = ( "hello" ,5, "world" ,5);
$hash_one { "yes" } = 3;
$hash_one { "i" } = 1;
$hash_one { "am" } = 2;
@array_one  =  %hash_one ;
print  ( $hash_one { "hello" });
print  ( "@array_one" );
输出结果为:
5
yes 3 am 2 hello 5 world 5 i 1

7.4哈希的反转
建立值对应键的反转哈希。
%hash_reverse = reverse(%hash_one);
只有在键值一一对应的情况下才凑效,否则会有无法预期的覆盖发生。

7.5哈希的美观赋值
哈希的美观赋值使用=>符号。

%hash_one = (“hello”,5,”world”,5,”yes”,3,”i”,1,”am”,2);
上面这种赋值方式很容易搞错,特别是键值都是字符串的时候。
%hash_one = (
“hello” => 5,
“world” => 5,
“yes” => 3,
“i” => 1,
“am” => 2,
);

美观赋值,是不是看起来更美观,更容易区分哈什的键值呢。

7.6哈希的遍历

1)keys和values函数能返回所有键与值的列表,但列表内顺序不保证。
@k = keys(%hash_one);
@v = values(%hash_one);2)each函数能一一遍历哈希,返回键值对,非常适合于while等循环;
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" );
}
输出结果为:
yes am hello world i
3 2 5 5 1
yes=>3
am=>2
hello=>5
world=>5
i=>1

7.7哈希的查询与删除
(1)查询一个键是否存在,使用exists函数;
(2)删除一个键,使用delete函数;

#!/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" });
}

结果什么也不输出。

8.流程控制(本节可跳过,都是些花哨的用法)
除了各语言常用的if/esle,for,while等流程控制外,Perl还有一些特有的控制语句,更人性化。

1)unless控制结构
作用效果类似于if not,无效率上提升,只是使表达更自然,代码更容易理解。
(2)until控制结构
作用效果类似于while not3)条件修饰
判断条件可以直接写在语句的后面,以增加可读性(habadog注:这是鬼扯)。
print (“$n”) if $n < 0; $i *= 2 until $i > 1024;
&sumAdd($_) foreach @num_list;4)裸控制结构
只有一个花括号的结构,往往用来限制作用域,在各语言中都很常见。
{
$a = 1;}$a失效了
(5)last控制结构
相当于c中的break,立刻终止循环;
(6)next控制结构
相当于c中的continue,立刻开始下一次循环;
(7)redo控制结构
…独有的,重新开始本次循环;
while(1)
{跳到这里
print (“hello”);
redo;
}

9.高级特性
神奇的Perl还有正则、module、文件、字符串、智能匹配、进程管理、线程支持等高级特性,就不在入门手册里介绍了。
如果大伙喜欢,后续发布以上特性的手册。


http://www.ppmy.cn/news/203559.html

相关文章

Oracle / PLSQL: RPAD 函数的用法

Oracle / PLSQL: RPAD 函数的用法 1. Oracle/PLSQL RPAD 函数&#xff1a; 往源字符串的右侧填充一些字符 (字符串string1不能为空). 2. 语法格式&#xff1a; Oracle/PLSQL中RPAD 函数的 语法: RPAD( string1, padded_length [, pad_string] ) 3. 参数解释&#xff1a; …

perl语言介绍

Perl语言是一种高级动态编程语言&#xff0c;它是一种通用的脚本语言&#xff0c;常用于Web开发、系统管理、网络编程等领域。Perl语言由Larry Wall于1987年开发&#xff0c;它的设计理念是“简单、实用、灵活、有表现力”。Perl语言是一种自由软件&#xff0c;它的开发和使用都…

华为OD机试真题 Java 实现【工作安排】【2023Q1 100分】

一、题目描述 小明每周上班都会拿着自己的工作清单,工作清单内包含n项工作,每项工作都有对应的耗时时长(单位h)和报酬,工作的总报酬为所有已完成工作的报酬之和。那么请你帮小明安排一下工作,保证小明在指定的工作时间内完成工作收入最大化。 二、输入描述 输入的第一…

Character.AI成为新晋AI聊天应用爆款;谷歌推出 Google Slides AI 图像生成

&#x1f989; AI新闻 &#x1f680; Character.AI&#xff1a;首周下载量超越ChatGPT&#xff0c;成为新晋AI聊天应用爆款 摘要&#xff1a;Character.AI是一款受欢迎的人工智能聊天应用&#xff0c;用户可以自由创建AI角色&#xff0c;并与它们聊天。该应用于2023年5月23日…

常用的两款 爱普生epson L801(L系列)清零软件 废墨重置软件 免分下载 内附清零软件使用方法

两款软件&#xff0c;第一款其实是L系列都可以用的&#xff0c;亲测是没问题的。 都是城通网盘下载&#xff0c;我不喜欢百度云&#xff0c;还要登陆&#xff0c;速度也不行。太麻烦&#xff0c;这种不大的下载&#xff0c;城通还算比较方便的。 不需要积分下载的&#xff0c…

相片打印机原理_照片打印机有哪些特点 照片打印机多少钱【详解】

照片打印机打印出来的照片一般能保证细致的打印效果和明显的层次感&#xff0c;所以深受现代年轻人的追捧&#xff0c;它可以完成数码直打操作&#xff0c;用起来也非常的方便。那么&#xff0c;照片打印机的特点有哪些&#xff1f;照片打印机价格是多少呢&#xff1f;今天小编…

1731_makefile编写小结1_编译同目录下的文件

全部学习汇总&#xff1a; GreyZhang/g_makefile: Learn makefile from all kinds of tutorials on the web. Happy hacking and lets find an common way so we may dont need to touch makefile code any more! (github.com) 欢迎路过的YUAN类朋友相互交流&#xff0c;以下是…

AngularJs学习笔记--unit-testing

javascript是一门动态类型语言&#xff0c;这给她带来了很强的表现能力&#xff0c;但同时也使编译器几乎不能给开发者提供任何帮助。因为这个原因&#xff0c;我们感受到编写任何javascript代码都必须有一套强大完整的测试。angular拥有许多功能&#xff0c;让我们更加容易地测…