【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_1[6] = "56" 而非 "56\n"

相关推荐
dreadp4 分钟前
解锁豆瓣高清海报(二) 使用 OpenCV 拼接和压缩
图像处理·python·opencv·计算机视觉·数据分析
Tester_孙大壮13 分钟前
第32章 测试驱动开发(TDD)的原理、实践、关联与争议(Python 版)
驱动开发·python·tdd
customer083 小时前
【开源免费】基于SpringBoot+Vue.JS体育馆管理系统(JAVA毕业设计)
java·vue.js·spring boot·后端·开源
Miketutu3 小时前
Spring MVC消息转换器
java·spring
乔冠宇3 小时前
Java手写简单Merkle树
java·区块链·merkle树
小王子10244 小时前
设计模式Python版 组合模式
python·设计模式·组合模式
LUCIAZZZ4 小时前
简单的SQL语句的快速复习
java·数据库·sql
komo莫莫da5 小时前
寒假刷题Day19
java·开发语言
Mason Lin5 小时前
2025年1月22日(网络编程 udp)
网络·python·udp
清弦墨客5 小时前
【蓝桥杯】43697.机器人塔
python·蓝桥杯·程序算法