# 获取环境变量的值
my $java_home = $ENV{"JAVA_HOME"};
字符串
截取字符串
# 截取字符串,从索引为3的位置(含)开始,截取长度为3
my sub_str1 = substr("abc123def", 3, 3);
# 截取字符串,从索引为3的位置(含)开始,截取到最后
my sub_str1 = substr("abc123def", 3);
拆分字符串
# 将字符串以.来拆分
# 拆分之后返回一个数组
my @split_array = split(/\./, "abc.123.def");
# 分别打印数组和对应的数组元素
print("split_array = @split_array \n");
print("split_array_0 = $split_array[0] \n");
print("split_array_1 = $split_array[1] \n");
print("split_array_2 = $split_array[2] \n");
# 不带括弧拆分也是可以的,看个人习惯,但是个人感觉还是要带括弧更容易阅读,不易出错
my @split_array1 = split /\./, "abc.123.def";
使用split函数去拆分字符串时,语法如下:
split(reg, str)
也就是说,第一参数是匹配的正则表达式,第二个参数为需要拆分的字符串。关于正则表达式的使用大家可以自行百度。
需要注意的是,正则表达式需要放置在//中间,也就是两个/之间。比如,如果我们要以\拆分,那么就应该是:
# 特殊字符,比如\需要转义,我们的字符串中需要转义,正则中也需要转义
split(/\\/, "abc\\123\\def");
# 正则中需要转义,字符串中不需要
# 第一个参数解读:通过\把/转义,组合起来就是\/,然后放入到perl的正则匹配字符//之中,
# 最后就是/\//
split(/\//, "abc/123/def");
比较运算符
数字比较:
== | 数字相等 |
!= | 不相等 |
> | 左边数字大于右边数字 |
< | 小于右边 |
>= | 大于等于右边 |
<= | 小于等于右边 |
<=> | 如果左边的数小于右边的数返回 -1,如果相等返回 0, 如果左边的数大于右边的数返回 1 。 |
字符串比较:
lt | 小于 | less than |
gt | 大于 | greater than |
le | 小于等于 | less than or equal to |
ge | 大于等于 | greater than or equal to |
eq | 等于 | equal to |
ne | 不等于 | not equal to |
cmp | 如果左边的字符串大于右边的字符串返回 1,如果相等返回 0,如果左边的字符串小于右边的字符串返回 -1。 | compare |
逻辑运算符:
and | 逻辑与运算符符。如果两个操作数都为 true,则条件为 true。 |
&& | 同上 |
or | 逻辑或运算符。如果两个操作数中有任意一个非零,则条件为 true。 |
|| | 同上 |
not | 起否定作用,类似于Java中的!,如果条件为true,则在前面加上 not 则为false |
perl正则表达式,主要有三种模式:
- 匹配:m//(还可以简写为//,略去m)
- 替换:s///
- 转化:tr///
关于Perl的正则表达式,可以参考菜鸟教程:
my $str = "abc";
# 转大写
my $str1 = uc($str);
# 首字母转大写
my $str2 = ucfirst($str);
# 转大写
my $string = 'welcome to runoob site.';
$string =~ tr /a-z/A-Z/;
print "\$string = $string\n";
# 转小写
my $string = 'welcome to runoob site.';
$string =~ tr /A-Z/a-z/;
print "\$string = $string\n";
# 转小写
my $str5 = "Welcome To Shanghai";
$str5 = lc($str5);
print("\$str5 = $str5\n");
# 首字母转小写
my $str6 = "WELCOME TO SHANGHAI";
$str6 = lcfirst($str6);
print("\$str6 = $str6\n");
# 获取操作系统名称
my $os = $^0;
$os = lc($os);
print("os = $os\n");
# os可能的取值是aix、linux、mswin32,其余的未知
# .= 拼接字符串
my $str = "abc";
my $str1 = "123";
my $str2 = $str .= $str1;
print("str2 = $str2 \n");
文件测试操作符
-d | 为目录 |
-e | 文件或目录名存在 |
-f | 为普通文件 |
-p | 文件是命名管道(FIFO) |
-s | 文件或目录存在且不为0(返回字节数) |
-z | 文件存在,大小为0(目录恒为false),即是否为空文件 |
文件操作
# 删除文件
unlink("/home/dake/file/test.txt");
执行shell命令
# 执行shell命令
# 两边的括弧是反引号,就是ESC下面的那个按钮,在英文状态下的输出结果
`mkdir -p dir1/dir2 && chmod 755 dir1/dir2`;
# 也可以给出返回结果,方便判断 shell 命令执行结果是否正确
my $result = `mkdir -p dir1/dir2 && chmod 755 dir1/dir2`;
特殊变量
@_:接收函数变量的数组,类似于 Java 等面向对象语言的接收参数的对象。
# 定义函数
sub test {
my (filed1, filed2, filed3) = @_;
# ...
}
# 调用函数
test($id, $name, $age);
# 调用参数时传递几个,@_参数数组就可以接收几个。
# 如果传递的多了,接收的时候少,不影响
类似于 Java 等面向对象语言的实体类
// 定义函数
public void test (Person person){
String id = person.getId();
String name = person.getName();
String age = person.getAge();
// ...
}
# 调用函数
Person person = new Person();
person.setId("1");
person.setName("张三");
person.setAge(18);
test(person);
那这里的@_是不是就等于上面示例中的person示例呢?
那如果我想获取对应数组中的某个参数呢?使用下标即可。
$id = $_[0];
$name = $_[1];
# 以上分别是获取接收参数的第一个和第二个参数
# 注意,下标从0开始
# 注意,接收具体某个参数的符号是$,不能使用数组符号@
$_:表示当前被遍历的元素