Skip to content

Instantly share code, notes, and snippets.

@changkun
Created April 10, 2019 06:49
Show Gist options
  • Select an option

  • Save changkun/0bd926e5b9bfcf91a783e4d033feaf41 to your computer and use it in GitHub Desktop.

Select an option

Save changkun/0bd926e5b9bfcf91a783e4d033feaf41 to your computer and use it in GitHub Desktop.
perl in an hour
#!/usr/bin/perl -w
use strict;
use warnings;
# 单行注释
print('Hello,
$world!\n');
my $world = "world";
print "Hello,
$world!\n"; # 会输出分行,支持单双引号
# 双引号可以正常解析一些转义字符与变量,而单引号无法解析会原样输出。
# 单双引号决定了能否转移
my $var = << "EOF";
还可以这么写文档?
比如说: world = $world
EOF
print "$var\n";
=pod 多行注释
神奇的设计
=cut
my @arr=(1,2,3,4);
print @arr;
my %h=(
'a' => 1,
'b' => 2
);
print %h;
# 转义
# \\ 反斜线
# \' 单引号
# \" 双引号
# \a 系统响铃
# \b 退格
# \f 换页符
# \n 换行
# \r 回车
# \t 水平制表符
# \v 垂直制表符
# \0nn 创建八进制格式的数字
# \xnn 创建十六进制格式的数字
# \cX 控制字符,x可以是任何字符
# \u 强制下一个字符为大写
# \l 强制下一个字符为小写
# \U 强制将所有字符转换为大写
# \L 强制将所有的字符转换为小写
# \Q 将到\E为止的非单词(non-word)字符加上反斜线
# \E 结束\L、\U、\Q
# 解释器会自动分配匹配的类型空间。
# 变量使用等号(=)来赋值。
# 标量 $ 开始, 如$a $b 是两个标量。
# 数组 @ 开始 , 如 @a @b 是两个数组。要访问数组的变量,可以使用美元符号($)+变量名,并指定下标来访问
my @ages = (25, 30, 40);
print "\$ages[0] = $ages[0]\n";
# 哈希 % 开始 , %a %b 是两个哈希。如果要访问哈希值,可以使用 $ + {key} 格式来访问
my %data = ('google', 45);
print "\$data{'google'} = $data{'google'}\n";
# 所谓上下文:指的是表达式所在的位置。
# 上下文是由等号左边的变量类型决定的,等号左边是标量,则是标量上下文,等号左边是列表,则是列表上下文。
# Perl 解释器会根据上下文来决定变量的类型。
my @names = ('google', 'changkun');
my @copy = @names; # 复制数组
my $size = @names; # 数组赋值给标量,返回数组元素个数
print "名字为 : @copy\n";
print "名字数为 : $size\n";
# 代码中 @names 是一个数组,它应用在了两个不同的上下文中。
# 第一个将其复制给另外一个数组,所以它输出了数组的所有元素。
# 第二个我们将数组赋值给一个标量,它返回了数组的元素个数。
# 其他上下文
# 标量 − 赋值给一个标量变量,在标量上下文的右侧计算
# 列表 − 赋值给一个数组或哈希,在列表上下文的右侧计算。
# 布尔 − 布尔上下文是一个简单的表达式计算,查看是否为 true 或 false。
# Void − 这种上下文不需要关系返回什么值,一般不需要返回值。
# 插值 − 这种上下文只发生在引号内。
# 数字
my $integer = 200;
my $negative = -300;
my $floating = 200.340;
my $bigfloat = -1.2E-23;
# 八进制 377 , 十进制为 255
my $octal = 0377;
# 十六进制 FF, 十进制为 255
my $hexa = 0xff;
print "integer = $integer\n";
print "negative = $negative\n";
print "floating = $floating\n";
print "bigfloat = $bigfloat\n";
print "octal = $octal\n";
print "hexa = $hexa\n";
# 运算
my $str = "hello" . "world"; # 字符串连接
my $num = 5 + 10; # 两数相加
my $mul = 4 * 5; # 两数相乘
my $mix = $str . $num; # 连接字符串和数字
print "str = $str\n";
print "num = $num\n";
print "mix = $mix\n";
print <<EOF;
多行
输出
EOF
# 特殊字符
print "文件名 ". __FILE__ . "\n";
print "行号 " . __LINE__ ."\n";
print "包名 " . __PACKAGE__ ."\n";
# v 字符串
# 一个以 v 开头,后面跟着一个或多个用句点分隔的整数,会被当作一个字串文本。
my $smile = v9786;
my $foo = v102.111.111;
my $martin = v77.97.114.116.105.110;
print "smile = $smile\n";
print "foo = $foo\n";
print "martin = $martin\n";
# 以 qw 开始定义数组。
my @array = qw/这是 一个 数组/;
print $array[2];
print "$array[-1]\n"; # 负数,反向读取
# 数组序号
my @var_10 = (1..10);
my @var_20 = (10..20);
# my @var_abc = (a..z); # z 和 z 是 barewords(like string),strict mode 下不能使用
print "@var_10\n"; # 输出 1 到 10
print "@var_20\n"; # 输出 10 到 20
# print "@var_abc\n"; # 输出 a 到 z
my $max_index = $#array;
print "最大索引: $max_index\n";
# 数组操作
# 创建一个简单是数组
my @sites = ("google","changkun");
print "1. \@sites = @sites\n";
# 在数组结尾添加一个元素
push(@sites, "baidu");
print "2. \@sites = @sites\n";
# 在数组开头添加一个元素
unshift(@sites, "weibo");
print "3. \@sites = @sites\n";
# 删除数组末尾的元素
pop(@sites);
print "4. \@sites = @sites\n";
# 移除数组开头的元素
shift(@sites);
print "5. \@sites = @sites\n";
# 切割数组
@sites = qw/google taobao weibo qq facebook 网易/;
my @sites2 = @sites[3,4,5];
@sites2 = @sites[3..5];
print "@sites2\n";
# 替换
# splice @ARRAY, OFFSET [ , LENGTH [ , LIST ] ]
my @nums = (1..20);
print "替换前 - @nums\n";
splice(@nums, 5, 5, 21..25);
print "替换后 - @nums\n";
# 字符串替换为数组
# split [ PATTERN [ , EXPR [ , LIMIT ] ] ]
# PATTERN:分隔符,默认为空格。
# EXPR:指定字符串数。
# LIMIT:如果指定该参数,则返回该数组的元素个数。
# 定义字符串
my $var_string = "www-runoob-com";
my $var_names = "google,taobao,weibo";
# 字符串转为数组
my @string = split('-', $var_string);
@names = split(',', $var_names);
print "$string[2]\n"; # 输出 com
print "$names[2]\n"; # 输出 weibo
# 连接数组
# join EXPR, LIST
# EXPR:连接符。
# LIST:列表或数组。
# $string1 = join( '-', @string );
# 排序
# sort [ SUBROUTINE ] LIST
# SUBROUTINE:指定规则。
# LIST:列表或数组。
# @sites = sort(@sites);
# 特殊变量: $[
# 特殊变量 $[ 表示数组的第一索引值,一般都为 0 ,
# 如果我们将 $[ 设置为 1,则数组的第一个索引值即为 1,第二个为 2,以此类推。
# 不建议使用!!!!!
# 合并
# 数组的元素是以逗号来分割,我们也可以使用逗号来合并数组
# @numbers = (1,3,(4,5,6));
# @odd = (1,3,5);
# @even = (2, 4, 6);
# @numbers = (@odd, @even);
$var = 10;
my $r = \$var;
if (ref($r) == 'SCALAR') {
print 'YES'
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment