【perl】脚本编程的一些坑&案例



引言

记录自己跳进的【perl】编程小坑,以己为鉴。


1、eq

str1 = "12345\\n"; str2 = "12345";

if (str1 eq str2)

{

print "OK"

}

上述代码不会打印 OK。特别在读文件 ,匹配字符串时容易出BUG。

案例说明:

有一个需求,对于test_A.txt文件的每一行,找出test_B.txt文件中与之相同的内容,打印该行内容,并显示行号。

test_A.txt 以及 test_B.txt 文件中内容:

如果你的代码是这么写的:

perl 复制代码
open test_A_handle , "<D:\\Perl_WorkSpace\\test_A.txt\n" or die "can't open the file test_A.txt\n";
open test_B_handle , "<D:\\Perl_WorkSpace\\test_B.txt\n" or die "can't open the file test_B.txt\n";

$pos = tell(test_B_handle);#获取文件指针位置,因为刚打开文件,所以 $pos为0

while (my $str1 = <test_A_handle>)
{
    seek(test_B_handle,$pos,0);#使文件指针回到文件头
    my $cnt = 0;
    while(my $str2 = <test_B_handle>)
    {   
        $cnt++;
        if ($str1 eq $str2)
        {
            print "match string :" . $str1 . " ";
            print "line num : " . $cnt . "\n";
        }
    }
}
close test_A_handle;
close test_B_handle;

那么你得到的结果是:

perl 复制代码
match string :1111111
 line num : 5
match string :1111111
 line num : 9
match string :2222222
 line num : 6
match string :3333333
 line num : 7
match string :4444444
 line num : 8
match string :1234567
 line num : 1
match string :0000000
 line num : 2
match string :0978157
 line num : 3

乍一看没啥毛病,但是细看发现test_A.txt文件中第一行,在test_B.txt文件的第12行也出现了,但是没有匹配到。原因在哪里呢?因为test_B.txt文件的第12行是最后一行,行末没有换行符\n,因为perl认为 "1111111" 不等于 "1111111\n"。那么我们在比较之前用chomp函数将换行符去掉即可解决这个小BUG。代码:

perl 复制代码
open test_A_handle , "<D:\\Perl_WorkSpace\\test_A.txt\n" or die "can't open the file test_A.txt\n";
open test_B_handle , "<D:\\Perl_WorkSpace\\test_B.txt\n" or die "can't open the file test_B.txt\n";

$pos = tell(test_B_handle);#获取文件指针位置,因为刚打开文件,所以 $pos为0

while (my $str1 = <test_A_handle>)
{   
    chomp $str1;
    seek(test_B_handle,$pos,0);#使文件指针回到文件头
    my $cnt = 0;
    while(my $str2 = <test_B_handle>)
    {   
        chomp $str2;
        $cnt++;
        if ($str1 eq $str2)
        {
            print "match string :" . $str1 . " ";
            print "line num : " . $cnt . "\n";
        }
    }
}
close test_A_handle;
close test_B_handle;

输出:

2、split

perl 复制代码
my $str_1 = "ab cd ef gh 12 34 56\n";
my @array_1 = split(' ',$str_1);
print @array_1;
print "1234567890";

上述代码片段输出结果是什么?

abcdefgh1234561234567890

还是

abcdefgh123456

1234567890

split拆分之后,将\n去除了。也即是说$array_16 = "56" 而非 "56\n"

相关推荐
互联网中的一颗神经元1 分钟前
小白python入门 - 39. 采集流水线小项目
开发语言·python
Ai拆代码的曹操29 分钟前
Spring 事务 REQUIRES_NEW 嵌套调用:连接池翻倍的秘密
java·后端·spring
郭老二1 小时前
【Python】常用模块:xmlrpc
python
动恰客流统计1 小时前
ReID边缘计算视觉统计:餐饮店客流增长的数字化破局路径
java·大数据·运维·人工智能
名字还没想好☜1 小时前
Python itertools 实战:用 groupby、chain、islice 优雅处理大数据流
linux·windows·python·迭代器·itertools
Ivanqhz2 小时前
Rust &‘static str浅析
java·前端·javascript·rust
威联通网络存储2 小时前
TS-h2490FU在面板制造Array段AOI缺陷画廊中的并联
python·制造
接针3 小时前
UV 常用命令
python·uv
无垠的广袤4 小时前
【工业树莓派 CM0 Dev Board】扩展板设计
linux·python·嵌入式硬件·pcb设计·模块化·传感器
weixin_419658314 小时前
Docker 搭建 Jenkins 服务
java·docker·jenkins