Perl 实用技巧
perl 作为一个脚本语言竟然有指针,真的是醉了。 perl 使用 print 输出,但是当你输出一个数组或者对象时,只能得到指针。 这不是我们想要的😣
所以对于复杂数据,我们需要借助Dumper。 使用🌰
use Data::Dumper;
my $user = {
id => 1,
name => 'thaddeus jiang'
};
print Dumper($user);
int(Exp)
# (int)(127.094)是不行的。
使用 CPAN 自动安装
1. 首先你需要获得root权限: sudo
2. 连接 CPAN: perl -MCPAN -e shell
3. 根据关键字查找相关模块: cpan> i /test/
4. 安装模块:cpan> install Test::Class
5. 退出 cpan> q
相等 == eq
不等 != ne
小于 < lt
大于 > gt
小于等于 <= le
大于等于 >= ge
perl是一种面向字符串的语言。 与其他大部分语言不一样,perl没有不同的变量类型。 perl只有一种数据类型:字符串
chomp;
# 字符串 -> 数值
$num = ord($char);
# 数值 -> 字符串
$char = chr($num);
# 方法1:将数组赋值给一个标量
my $length = @arr;
perl 只有三种数据结构: 标量、数组、哈希
# 标量
my $data = 'hello';
# 数组
my $arr = (1,2,3);
# 哈希
my $h = ('a' => 1, 'b' =>2);
最常用 qq 和 qw。
q 相当于单引号 '',对转义字符无效,生成字符串
qq 相当于双引号 "",对转义字符有效,生成字符串
qw 为每个元素添加单引号'',对转义字符无效,生成数组
qr 创建正则表达式
qx 执行外部程序
my $html =<<end_tag;
<body>
<body>
end_tag
#!/usr/bin/perl
sub hello {
print "hello world\n";
}
hello();
perl 未提供相关函数。
#方法1: 使用 grep ,个人觉得好理解
if (grep {$something == $_} @array) {
print "exist\n";
}
# 方法2: 又是 perl 的特殊符号,🖕
if ($something~~@array) {
print "exist\n";
}
所以必须是 @ or %
在使用 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);
以上😄
# /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
) ],
next 相当于 continue
last 相当于 break
-
问题发生的时间 2017/12/14
-
问题简述 perl 双引号当作字符串模版使用时,形如$value1[$value2]会出现bug。 $value1 会被当作数组解析。
-
问题发生的时间 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 函数定义时,被调用函数先定义。
个人配置文件 https://gist.github.com/ThaddeusJiang/32837080fc62a42d6bc550c190deeec3
Terminal 使用方法:$ perltidy -b file
VSCode https://marketplace.visualstudio.com/items?itemName=sfodje.perltidy