当前位置: 首页 > news >正文

Perl语言基础

文章目录

  • 0. 杂记
  • 1. 注释
  • 2. 数据类型
    • 2.1 标量
      • 2.1.1 数值标量
      • 2.1.2 字符标量
      • 2.1.3 标量操作
      • 2.1.4 多行字符串
      • 2.1.5 特殊标量
    • 2.2 数组
      • 2.2.1 声明数组
      • 2.2.2 序列数组
      • 2.2.3 数组大小
      • 2.2.4 添加和删除
      • 2.2.5 数组切片
      • 2.2.6 数组替换
      • 2.2.7 字符串转数组
      • 2.2.8 数组转换为字符串
      • 2.2.9 数组排序
      • 2.2.10 特殊变量
      • 2.2.11 合并数组
    • 2.3 散列
      • 2.3.1 声明
      • 2.3.2 提取切片
      • 2.3.3 提取键值
      • 2.3.4 检查元素是否存在
      • 2.3.5 获取大小
      • 2.3.6 添加和删除
    • 2.4 字符串
  • 3. 条件分支
  • 4. 循环控制
  • 5. 运算符
  • 6. 子程序
  • 7. 指针/引用
  • 8. 文件操作
    • 8.1 打开文件
    • 8.2 关闭文件
    • 8.3 FILEHANDLE运算符
    • 8.3 复制文件
    • 8.4 重命名文件
    • 8.5 删除文件
    • 8.6 文件信息
  • 9. 目录操作
    • 9.1 标准函数
    • 9.2 显示所有文件
    • 9.3 创建目录
    • 9.4 删除目录
    • 9.5 更改目录
  • 10. 错误处理
  • 11. 特殊变量

Perl(Practical Extraction and Report Language)

0. 杂记

查看版本信息:perl -v

#!/usr/bin/perl
# This will print "Hello, World"
print "Hello, world\n";

第一行#!/usr/bin/perl是Perl的路径,根据实际情况修改,通过which perl命令来确认路径

  • Perl语言不关心空格,但在引号内按原样打印
  • 双引号会对转义字符进行转义,单引号不会转义
  • 变量以$、@和%开头

1. 注释

  • 单行注释:#
  • 多行注释:以=开头的行被解释为嵌入式文档(pod)的开始,并且编译器忽略下一个=cut之前的所有后续行
#!/usr/bin/perl
# This will print "Hello, World"
print "Hello, world\n";=begin comment
This is all part of multiline comment.
You can use as many lines as you like
These commnets will be ignored by the compiler util the next =cut is encountered
=cut

2. 数据类型

创建一个变量时,会在内存中保留一些空间

标量Scalar标量是简单的变量,前面有一个$符号,标量可以是数字、字符串或指针,指针实际上是变量的地址
数组Arrays数组是标量的有序列表,可以使用从0开始的数字索引访问它们,前面是一个@
散列Hashes使用键作为上下标的无序键/值对集合,前面是一个百分号%

2.1 标量

标量是一个数据单元,该数据可能是整数、浮点数、字符、字符串

#!/usr/bin/perl
$age = 25;                # a integer assignment
$name = "John Pail";      # a string
$salary = 1453.2;         # a folating pointprint "Age = $age\n";
print "Name = $name\n";
print "Salary = $salary\n";

2.1.1 数值标量

#!/usr/bin/perl
$interger = 200;
$negative = -300;
$floating = 200.340;
$bigfloat = -1.2E-23;#377 octal, same as 255 decimal
$octal = 0377;#FF hex, also 255 decimal
$hexa = 0xff;print "integer = $integer\n";            #200
print "negative = $negative\n";          #-300
print "floating = $floating\n";          #200.34
print "bigfloat = $bigfloat\n";          #-1.2e-23
print "octal = $octal\n";                #255
print "hexa = $hexa\n";                  #255

2.1.2 字符标量

#!/usr/bin/perl
$var = "This is string scalar!";
$quato = 'I am inside single quote -$var';
$double = "This is inside single quote -$var";
$escape = "This example of escape -\tHello,World!";print "var = $var\n";           #This is string scalar!
print "quote = $quote\n";       #I am inside single quote -$var
print "double = $double\n";     #This is inside single quote -This is string scalar!
print "escape = $escape\n";     #This example of escape	-	Hello,World!

2.1.3 标量操作

#!/usr/bin/perl
$str = "hello"."world";          #Concatenates strings
$num = 5 + 10;                   #adds two numbers
$mul = 4 * 5;                    #multiplies two numbers
$mix = $str . $num;              #concatenates string and numberprint "str = $str\n";           #helloworld
print "num = $num\n";           #15
print "mul = $mul\n";           #20
print "mix = $mix\n";           #helloworld15

2.1.4 多行字符串

想在程序中引入多行字符串,使用单引号

#!/usr/bin/perl
$string = 'This is
a multiline
string';print "$string\n";

2.1.5 特殊标量

_FILE_,_LINE_,_PACKAGE_代表程序中那个点的当前文件名、行号和包号

#!usr/bin/perl
print "File name". _FILE_ . "\n";
print "Line numbers" . _LINE_ . "\n";
print "Package" . _PACKAGE_ . "\n";#they can not be interpolated
print "_FILE_ _LINE_ _PACKAGE_\n";

2.2 数组

数组是存储标量值的有序列表,数组前是@,使用$变量名称[]进行索引。

@age = (25, 30, 40);
@name = ("John","Lisa","Tom");print "\$age[0] = $age[0]";
print "\$name[0] = $name[0]";

2.2.1 声明数组

@为前缀,并使用括号qw运算符填充
qw//返回一个字符串列表,用空格分隔

@array = (1,2,'hello');
@array = qw/THis is an array/;

2.2.2 序列数组

#!/usr/bin/perl
@var_10 = (1..10);print "@var_10\n";   #Prints number from 1 to 10

2.2.3 数组大小

可以使用数组上的标量上下文确定,返回值将是数组中的元素数,物理大小,不是元素的数量

#!/usr/bin/perl
@array = (1,2,3);
$array[50] = 4;$size = @array;
$max_index = $#array;print "Size: $size\n";   #51
print "Max Index: $max_index\n";  #50   

2.2.4 添加和删除

末尾操作:push、pop
头部操作:shift、unshift

#!/usr/bin/perl
#create a simple array
@coins = ("Quarter","Dime","Nickel");
print "1、\@coins = @coins\n";     #1、@coins = Quarter Dime Nickel#add one element at the end of the array
push(@coins, "Penny");
print "2、\@coins = @coins\n"";     #2、@coins = Quarter Dime Nickel Penny#add one element at the beginning of the array
unshift(@coins, "Dollar");
print "3、\@coins = @coins\n"";     #3、@coins = Dollar Quarter Dime Nickel Penny#remove one element from the last of the array
pop(@coins);
print "4、\@coins = @coins\n"";     #4、@coins = Dollar Quarter Dime Nickel#remove one element from the beginning of the array
shift(@coins);
print "5、\@coins = @coins\n"";     #5、@coins = Quarter Dime Nickel

2.2.5 数组切片

从数值中选择多个元素以生成另一个数组

#!/usr/bin/perl
@day = qw/Mon Tue Wed Thu Fri Sat Sun/;
@weekday = @day[3,4,5];    #or @weekday = @day[3..5];print "@weekdays\n";              #Thu Fri Sat 

2.2.6 数组替换

删除由OFFSET和LENGTH指定的@ARRAY的元素,并用LIST(如果指定)替代,最后返回从数组中删除的元素
splice @ARRAY,OFFSET [ , LENGTH, [ , LIST]]

#!/usr/bin/perl
@nums = (1..20);
print = "Before - @nums\n";splice(@nums, 5, 5, 21..25);
print = "After - @nums\n";  #从第6个数字开始,将5个元素从6替换到10,分别是2122232425

2.2.7 字符串转数组

将字符串拆分为一个字符串数组,如果指定LIMIT,则最多拆分为该数量的字段,如果省略PATTERN,则在空格出拆分
split [PATTERN [ , EXPR [ , LIMIT]]]

#!/usr/bin/perl
#define Strings
$var_string = "Rain-Drops-On-Roses-And-Whiskers-On-Kittens";
$var_names = "Larry, David, Roger, Ken, Michael, Tom";#transform above string into arrays
@string = split('_', $var_string);
@names = split(',', $var_names);print "$string[3]\n";         # Roses
pring "$names[4]\n";          # Michael 

2.2.8 数组转换为字符串

jion EXPR, LIST

#!/usr/bin/perl
#define Strings
$var_string = "Rain-Drops-On-Roses-And-Whiskers-On-Kittens";
$var_names = "Larry, David, Roger, Ken, Michael, Tom";#transform above string into arrays
@string = split('_', $var_string);
@names = split(',', $var_names);$string1 = join('-',@string);
$string2 = join(',',@names);
print "$string1\n";         
print "$string2\n";          

2.2.9 数组排序

sort LIST 根据单词的ASCII数值执行

#!/usr/bin/perl#define an array
@foods = qw(pizza steak chicken burgers);
print "Before: @foods\n";#sort this array
@foods = sort(@foods);
print "After: @foods\n";

2.2.10 特殊变量

$[这个特殊变量是一个标量,包含所有数组的第一个索引。Perl数组具有从零开始的索引,所以几乎总为0

#!/usr/bin/perl#define an array
@foods = qw(pizza steak chicken burgers);
print "Foods: @foods\n";#Let's reset first index of all the arrays
$[ = 1;print "Food at \@foods[1]: $foods[1]\n";             #pizza
print "Food at \@foods[2]: $foods[2]\n";             #steak
#没改之前是steak和chicken

2.2.11 合并数组

#!/usr/bin/perl
@number = (1,3,(4,5,6));
print "number = @numbers\n";     #1 3 4 5 6
#!/usr/bin/perl
@odd = (1,3,5);
@even = (2,4,6);@number = (@odd,@even);
print "numbers = @numbers\n";   #1 3 5 2 4 6

2.3 散列

散列是一组键值对,前面是一个%,使用$变量名{键} 来索引值

#!/usr/bin/perl
%data = ('John'=>45, 'Lisa'=>30,'Tom'=>40);
print "\$data{'John Paul'} = $data{'John Paul'}\n";

2.3.1 声明

$data{'John'}=45;
$data{'Lisa'}=30;
$data{'Tom'}=40;%data = ('John',45, 'Lisa',30,'Tom',40);%data = ('John'=>45, 'Lisa'=>30,'Tom'=>40);

2.3.2 提取切片

#!/usr/bin/perl
%data = ('John'=>45, 'Lisa'=>30,'Tom'=>40);
@array = @data{'John','Lisa'};
print "Array : @array\n";         #45 30

2.3.3 提取键值

keys %HASH获取key

#!/usr/bin/perl
%data = ('John Paul'=>45, 'Lisa'=>30, 'Kumar'=>40);
@names = keys %data;print "$names[0]\n";   #John Paul

values %HASH获取value

#!usr/bin/perl
%data = ('John Paul'=>45, 'Lisa'=>30, 'Kumar'=>40);
@ages = values %data;
print "@ages[0]\n";    #40

2.3.4 检查元素是否存在

exists()

#!/usr/bin/perl
%data = ('John Paul'=>45, 'Lisa'=>30, 'Kumar'=>40);
if(exists($data{'Lisa'})){print "Lisa is $data{'Lisa'} years old\n"; 
}else{print "I don't know age of Lisa\n";
}

2.3.5 获取大小

通过在键或值上使用标量上下文来获取大小,即哈希中的元素数,即必须得到一个键或值得数组,然后得到数组的大小

#!/usr/bin/perl
%data = ('John Paul'=>45, 'Lisa'=>30, 'Kumar'=>40);@keys = keys %data;
$size = @keys;
print "1 - Hash size: is $size\n";@values = values %data;
$size = @values;
print "2 - Hash size: is $size\n";

2.3.6 添加和删除

赋值delete

#!/usr/bin/perl
%data = ('John Paul'=>45, 'Lisa'=>30, 'Kumar'=>40);
@keys = keys %data;
$size = @keys;
print "1 - Hash size: is $size\n";      # 3#adding an element to the hash
$data{'Ali'}=55;
@keys = keys %data;
$size = @keys;
print "2 - Hash size: is $size\n";      # 4#delete the same element from the hash
delete $data{'Ali'};
@keys = keys %data;
$size = @keys;
print "3 - Hash size: is $size\n";      # 3

2.4 字符串

  • 字符串是字符序列,有单引号和双引号分隔
  • 双引号字符串需要变量插值,单引号不允许。
  • 转义字符

Perl根据上下文不同地对待相同名称的变量

#!/usr/bin/perl
@name = ('John','Lisa','Tom');@copy = @name;
$size = @name;print "Given name are : @copy\n";  #John Lisa Tom
print "Number of name : $size\n";  # 3

3. 条件分支

在Perl中,数字0、字符串‘0’和“ ”、空列表()和undef在布尔上下文中都是false,所有其他值都是true
if
if...else
if... elsif...else
unless与if逻辑相反
unless...else
unless...elsif...else
switch允许一种简单的方法将变量值与各种条件进行比较
Exp1 ? Exp2 : Exp3

4. 循环控制

while
until
for
foreach
do...while

5. 运算符

算术+ - * / % **

等式== != > < >= <=
<=> :返回值可以-1 0 1,如果是-1则小于
小于lt 大于gt 小于等于le 大于等于ge 等于eq 不等于ne
cmp:返回-1,则小于

赋值= += -= *= /= **=
位运算& | ^ ~ << >>
逻辑and && or || not

引用
q{}q{abcd}='abcd'
qq{}qq{abcd}="abcd"
qx{}qx{abcd}='abcd'

其他
.字符串拼接
x ('-'x3)=> ---
.. (2..5)=> (2,3,4,5)
++ -- 自增 自减
-> $obj->$a => 拿到obj中的a

6. 子程序

#!/usr/bin/perl
#Function definition
sub Hello{print "Hello, World!\n";
}
#Function call
Hello();

特殊数组@_

#!/usr/bin/perl
#Function definition
sub Average{#get total number of arguments passed.$n = scalar(@_);$sum = 0;foreach $item(@_){$sum += $item;}$average = $sum/$n;print "Average for the given numbers : $average\n ";
}#Function call
Average(10,20,30);

如果必须将列表与其他标量参数一起传递,则将列表作为最后一个参数

#!/usr/bin/perl
#Function definition
sub PrintList{my @list = @_;print "Given list is @list\n");
}
$a = 10;
@b = (1,2,3,4);#Function call with list parameter
PrintList($a, @b);

散列传递给子程序

#!/usr/bin/perl
#Function definition
sub PrintHash{my (%hash) = @_;foreach my $key(keys %hash){my $value = $hash{$key};print "$key : $value\n";}
}
%hash = ('name'=>'Tom', 'age'=>19);#Function call with hash parameter
PrintHash(%hash);

私有变量
my运算符创建变量

sub somefunc{my $variable;    # $variable is invisible outside somefunc()my ($another, @an_array, %a_hash);  #declaring many variable at once
}

局部变量
local

#!/usr/bin/perl
#Global variable
$string = "Hello, World!";sub PrintHello{#Private variable for PrintHello functionlocal $string;$string = "Hello,Perl";PrintMe();print "Inside the function PrintHello $string\n";
}
subPrintMe{print "Inside the function PrintMe $string\n";
}#Function call
PrintHello();              #Hello Perl
print "Outside the function $string";   # Hello World

state变量
state 全局变量

#!/usr/bin/perl
use feature 'state';sub PrintCount{state $count = 0;  #initial valueprint "Value of counter is $count\n";$count++;
}for(1..5){PrintCount();                   # 0 1 2 3 4 
}

7. 指针/引用

反斜杠\

$scalarref = \$foo;
$arrayref  = \@ARGV;
$hashref   = \%ENV;
$coderef   = \&handler;

创建数组的指针

$arrayref = [1,2,['a','b','c']];

哈希的指针

%hashref = {'Adam' => 'Eve','Clyde' => 'Bonnie'
};

子程序指针

$coderef = sub {print "Boink!\n"}

指针引用
使用$、@和%作为前缀

$var = 10;
$r = \$var;
print "value of $var is : ",$$r,"\n");@var = (1,2,3);
$r = \@var;
print "Value of @var is:", @$r, "\n");%var = ('key1'=>10, 'key2'=>20);
$r = \%var;
print "Value of %$r is:", %$r, "\n";

确定变量类型
ref
SCALAR、ARRAY、HASH、CODE、GLOB、REF

#!/usr/bin/perl$var = 10;$r = \$var;print "Reference type in r :", ref($r),"\n";           #SCALAR@var = (1,2,3);$r = \@var;print "Reference type in r :", ref($r),"\n";             #ARRAY%var = ('key1'=>10,'key2'=>20);$r = \%var;print "Reference type in r :", ref($r),"\n";             #HASH

函数的指针
\&

#Function defination
sub PrintHash{my (%hash) =@_;foreach $item(%hash){print "Item : $item\n";}
}
%hash = ('name'=>'Tom', 'age'=>19);$cref = \&PrintHash;
&$cref(%hash);

8. 文件操作

将文件句柄与文件相关联,然后使用Perl中的各种运算符合函数读写与文件句柄关联的文件

STDIN STDOUT STDERR 分别代表标志输入、标准输出和标准错误输出

8.1 打开文件

以只读模式打开file.txt,<符号表示文件以只读模式打开
DATA是文件句柄,用于读取文件

open(DATA, "<file.txt");

将打开一个文件并将其内容打印到屏幕上

#!/usr/bin/perl
open(DATA,"<file.txt") or die "Couldn't open file.txt,$!";while(<DATA>){while(<DATA>){print "$_";}}

以写入模式打开file.txt,>符号表示文件以写入模式打开

open(DATA,">file.txt") or die "Couldn't open file.txt,$!";

不同模式

  • < or w Read Only Access
  • > or w Creates,Writes, and Truncates
  • >> or a Writes, Appends, and Creates
  • +< or r+ Reads and Writes
  • +> or w+ Reads, Writes,Creates, and Truncates
  • +>> or a+ Reads,Writes, Appends, and Creates

8.2 关闭文件

close(DATA) || die "Couldn't close file properly";

8.3 FILEHANDLE运算符

在标量上下文中,从文件句柄返回一行

#!/usr/bin/perl
print "What is your name?\n";
$name = <STDIN>;
print "Hello $name\n";

在列表上下文中使用,从指定的文件句柄返回行列表

#!/usr/bin/perl
open(DATA,"<import.txt") or die "Can't open data";
@lines = <DATA>;
close(DATA);

8.3 复制文件

打开一个现有文件file1.txt逐行读取,生成另一个副本文件file2.txt

#!/usr/bin/perl
#Open file to read
open(DATA1,"<file1.txt");#Open new file to write
open(DATA2,">file2.txt");#Copy data from one file to another
while(<DATA1>){print DATA2 $_;
}
close (DATA1);
close (DATA2);

8.4 重命名文件

将文件file1.txt重命名为file2.txt

rename("/usr/test/file1.txt","/usr/test/file2.txt");

8.5 删除文件

unlink ("/usr/test/file1.txt");

8.6 文件信息

-X测试运算符

9. 目录操作

9.1 标准函数

  • opendir DIRHANDLE, EXPR
  • readdir DIRHANDLE
  • rewinddir DIRHANDLE— Positioning pointer to the begining
  • telldir DIRHANDLE— Returns current position of the dir
  • seekdir DIRHANDLE,POS— Pointing pointer to POS inside dir
  • closedir DIRHANDLE

9.2 显示所有文件

使用glob运算符获取并列出所有文件

#Display all the files in /tmp directory
$dir = "/tmp/*";
my @files = glob($dir);foreach(@files){print $_ . "\n";
}#Display all the C source files in /tmp directory
$dir = "/tmp/*.c";
@files = glob($dir);foreach(@files){print $_ . "\n";
}#Display all the hidden files
$dir = "/tmp/.*";
@files = glob($dir);
foreach(@files){print $_ . "\n";
}
#Display all the files from /tmp and /home directories
$dir = "/tmp/* /home/*";
@file = glob($dir);
foreach(@files){print $_ . "\n";
}

打开一个目录并列出该目录中所有可用的文件

opendir (DIR,".") or die "Couldn't open directory, $!";
while($file = readdir DIR){print "$file\n";
}
closedir DIR;
opendir (DIR,".") or die "Couldn't open directory, $!";
foreach(sort grep(/^.*\.c$/,readdir(DIR))){print "$_\n";
}
closedir DIR;

9.3 创建目录

$dir = "/tmp/perl";
#This creates perl directory in /tmp directory
mkdir($dir) or die "Couldn't creates $dir directory,$!";
print "Directory created successfully\n";

9.4 删除目录

$dir = "/tmp/perl";
#This removes perl directory in /tmp directory
rmdir($dir) or die "Couldn't creates $dir directory,$!";
print "Directory removed successfully\n";

9.5 更改目录

$dir = "/home";
#This changes perl directory and moves you inside /home directory
chdir($dir) or die "Couldn't go inside $dir directorym, $!";
print "Your new location is $dir\n";

10. 错误处理

一个健壮的出现如果发生错误,进行适当的报告定位,然后停止。

if语句

if(open(DATA,$file)){...
}else{die "Error: Couldn't open the file - $!";
}

or

open(DATA,$file) || die "Error: Couldn't open the file $!";

$!—Shell最后运行的后台Process的PID

unless函数
unless函数与if逻辑相反,只有在表达式返回false时才执行
例如:只有在chdir操作失败时才会die

unless(chdir("/ect")){die "Error:Can't change directory- $!";
}

or

die "Error:Can't change directory- $!"; unless(chdir("/ect"))

三元运算符

print(exists($hash{value}) ? 'There ' : 'Missing' , "\n");

warn函数
只是发出一个警告,消息被打印到STDERR,但没进一步的行为。

chdir('/etc') or warn "Can't change directory";

die函数
工作方式与warn一样,会调用exit

chdir('/etc') or die ""Can't change directory;

11. 特殊变量

$_—默认输入

foreach('hickory','dickory','doc'){print $_;print "\n";            #hickory dickory  doc
}

全局标量特殊变量$_
全局数组特殊变量@ARGV 脚本输入参数列表
全局哈希特殊变量%ENV 包含环境变量
全局特殊文本句柄STDIN 标准输入
全局特殊常量_FILE_ 程序执行当前文件
正则表达式特殊变量$digit $1表示正则表达式匹配中第一组括号中包含的任何内容

http://www.lryc.cn/news/574281.html

相关文章:

  • Windows环境Browser-Use平台部署与AI自动化远程访问实现过程
  • Java面试题027:一文深入了解数据库Redis(3)
  • Arrays.asList和 List<String> list = new ArrayList<>();有什么区别
  • C++11的内容
  • 智能生成分析报告系统在危化安全生产监测预警评估中的应用
  • NoSQL 之 Redis 配置与优化
  • 【科技公司的管理】
  • 深度解析 Caffeine:高性能 Java 缓存库
  • ​​MQTT​​通讯:​​物联网
  • 爬虫003----requests库
  • UP COIN:从 Meme 共识走向公链与 RWA 的多元生态引擎
  • VLN论文复现——VLFM(ICRA最佳论文)
  • 如何快速判断Excel文档是否被修改过?Excel多版本比对解决方案
  • 睿是信息携手Arctera,深化服务中国市场,共筑数据管理新未来
  • css元素超过两行隐藏并显示省略号全网独一份
  • 2025年CSS最新高频面试题及核心解析
  • ADIOS2 介绍与使用指南
  • 后台发热、掉电严重?iOS 应用性能问题实战分析全过程
  • 【数据结构初阶】--顺序表(一)
  • 【go的测试】单测之gomock包与gomonkey包
  • 板凳-------Mysql cookbook学习 (十--9)
  • K8S: etcdserver: too many requests
  • Halcon ——— OCR字符提取与多类型识别技术详解
  • Java 程序设计试题​
  • 多智能体协同的力量:赋能AI安全报告系统的智能设计之道
  • Elasticsearch(ES)与 OpenSearch(OS)
  • 苹果芯片macOS安装版Homebrew(亲测)
  • LoHoVLA技术:让机器人像人类一样思考与行动的统一框架
  • AI 智能体架构设计3阶段演进和3大关键技术对比剖析
  • 硬件工程师笔试面试高频考点汇总——(2025版)