Skip to content

Instantly share code, notes, and snippets.

@ThaddeusJiang
Last active January 17, 2019 08:54
Show Gist options
  • Save ThaddeusJiang/52eac5dda788ab05fc4dd0b08ff8d6f6 to your computer and use it in GitHub Desktop.
Save ThaddeusJiang/52eac5dda788ab05fc4dd0b08ff8d6f6 to your computer and use it in GitHub Desktop.
Perl 总结

Perl 实用技巧

perl 调试必备技能,使用 Dumper 输出复杂数据

perl 作为一个脚本语言竟然有指针,真的是醉了。 perl 使用 print 输出,但是当你输出一个数组或者对象时,只能得到指针。 这不是我们想要的😣

所以对于复杂数据,我们需要借助Dumper。 使用🌰

    use Data::Dumper;

    my $user = {
        id => 1,
        name => 'thaddeus jiang'
    };

    print Dumper($user);

perl 取整

int(Exp)
# (int)(127.094)是不行的。

perl 安装依赖

使用 CPAN 自动安装

1. 首先你需要获得root权限: sudo
2. 连接 CPAN: perl -MCPAN -e shell
3. 根据关键字查找相关模块: cpan> i /test/
4. 安装模块:cpan> install Test::Class
5. 退出 cpan> q

perl 运算符

相等     ==   eq
不等     !=    ne
小于      <    lt
大于      >    gt
小于等于 <=    le
大于等于 >=    ge

perl是一种面向字符串的语言。 与其他大部分语言不一样,perl没有不同的变量类型。 perl只有一种数据类型:字符串

perl 获取输入时去除字符串行尾包含的换行符

chomp;

perl 字符串和数值互转

# 字符串 -> 数值
$num = ord($char);
# 数值 -> 字符串
$char = chr($num);

perl 求数组长度

# 方法1:将数组赋值给一个标量
my $length = @arr;

perl 数据结构

perl 只有三种数据结构: 标量、数组、哈希

# 标量
my $data = 'hello';
# 数组
my $arr = (1,2,3);
# 哈希
my $h = ('a' => 1, 'b' =>2);

perl q qq qw qr qx 用法

最常用 qq 和 qw。

q 相当于单引号 '',对转义字符无效,生成字符串
qq 相当于双引号 "",对转义字符有效,生成字符串
qw 为每个元素添加单引号'',对转义字符无效,生成数组
qr 创建正则表达式
qx 执行外部程序

perl 创建 html

my $html =<<end_tag;
<body>
<body>

end_tag

perl 5 后,调用函数不再需要 &

#!/usr/bin/perl

sub hello {
    print "hello world\n";
}

hello();

perl 判断元素是否存在于数组中

perl 未提供相关函数。

#方法1: 使用 grep ,个人觉得好理解
if (grep {$something == $_} @array) {
    print "exist\n";
}

# 方法2: 又是 perl 的特殊符号,🖕
if ($something~~@array) {
    print "exist\n";
}

perl foreach 只能用于 数组or哈希

所以必须是 @ or %

perl 在填充SQL前,验证数据类型

在使用 perl 做数据库操作时,我们常常会看到👇代码。

	my $dbh = ...; # 数据库连接
	my $age = 26;
	my $sql = "select user_id from user_table where age=?";
	my $sth = $dbh->prepare($sql);

	$sth->bind_param(1, $age, SQL_INTEGER);
	$sth->execute();

	while (my ($user_id) = $sth->fetchrow) {
		# 处理
	}
	$sth->finish();

这里 $sth->bind_param(1, $age, SQL_INTEGER); 就是绑定参数,并判断参数类型。

1 // 第一个占位符
$age // 参数
SQL_INTEGER // 参数类型是整数

参数类型还有很多,这里有一个对照表

想要使用 SQL_INTEGER,引入 use DBI qw(:sql_types);

以上😄

perl sql 数据类型

# /usr/lib64/perl5/vendor_perl/DBI.pm
sql_types => [ qw(
    SQL_GUID
    SQL_WLONGVARCHAR
    SQL_WVARCHAR
    SQL_WCHAR
    SQL_BIGINT
    SQL_BIT
    SQL_TINYINT
    SQL_LONGVARBINARY
    SQL_VARBINARY
    SQL_BINARY
    SQL_LONGVARCHAR
    SQL_UNKNOWN_TYPE
    SQL_ALL_TYPES
    SQL_CHAR
    SQL_NUMERIC
    SQL_DECIMAL
    SQL_INTEGER
    SQL_SMALLINT
    SQL_FLOAT
    SQL_REAL
    SQL_DOUBLE
    SQL_DATETIME
    SQL_DATE
    SQL_INTERVAL
    SQL_TIME
    SQL_TIMESTAMP
    SQL_VARCHAR
    SQL_BOOLEAN
    SQL_UDT
    SQL_UDT_LOCATOR
    SQL_ROW
    SQL_REF
    SQL_BLOB
    SQL_BLOB_LOCATOR
    SQL_CLOB
    SQL_CLOB_LOCATOR
    SQL_ARRAY
    SQL_ARRAY_LOCATOR
    SQL_MULTISET
    SQL_MULTISET_LOCATOR
    SQL_TYPE_DATE
    SQL_TYPE_TIME
    SQL_TYPE_TIMESTAMP
    SQL_TYPE_TIME_WITH_TIMEZONE
    SQL_TYPE_TIMESTAMP_WITH_TIMEZONE
    SQL_INTERVAL_YEAR
    SQL_INTERVAL_MONTH
    SQL_INTERVAL_DAY
    SQL_INTERVAL_HOUR
    SQL_INTERVAL_MINUTE
    SQL_INTERVAL_SECOND
    SQL_INTERVAL_YEAR_TO_MONTH
    SQL_INTERVAL_DAY_TO_HOUR
    SQL_INTERVAL_DAY_TO_MINUTE
    SQL_INTERVAL_DAY_TO_SECOND
    SQL_INTERVAL_HOUR_TO_MINUTE
    SQL_INTERVAL_HOUR_TO_SECOND
    SQL_INTERVAL_MINUTE_TO_SECOND
    DBIstcf_DISCARD_STRING
    DBIstcf_STRICT
   ) ],

perl next 和 last

next 相当于 continue

last 相当于 break

perl 双引号当作字符串模版使用时,深坑。

  • 问题发生的时间 2017/12/14

  • 问题简述 perl 双引号当作字符串模版使用时,形如$value1[$value2]会出现bug。 $value1 会被当作数组解析。

perl_string_bug

perl cgi 中函数定义顺序,会响应运行结果。

  • 问题发生的时间 2017/12/13

  • 问题简述 cgi 文件中编写了两个函数, a 和 b,a 调用 b。 最开始我定义函数时,有语法错误。函数定义后面加了(),如下

sub a {
    b();
}
sub b() {
    # 正确定义应该是 sub b { ... }
}
错误提升(函数参数不匹配):
sub mistake

这个很简单,我把函数 b 定义改正一下就👌。

bug 就在这时出现了 我修改了 函数 b 的定义,刷新 cgi 画面,😡 相同的错误提示。 perl 语法我也不是很熟,我擦,这是神马鬼啊? 核实好多遍,函数参数,没问题啊。最后把函数 b 放在 a 前面定义,问题解决了。

我真是日了🐶 了。

解决方案详细描述

perl cgi 函数定义时,被调用函数先定义。

perl 代码格式化工具(perltidy)

个人配置文件 https://gist.github.com/ThaddeusJiang/32837080fc62a42d6bc550c190deeec3

Terminal 使用方法:$ perltidy -b file VSCode https://marketplace.visualstudio.com/items?itemName=sfodje.perltidy

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment