【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"

相关推荐
justjinji2 分钟前
JavaScript中利用宏任务拆分阻塞任务的实操案例
jvm·数据库·python
weixin_408717774 分钟前
c++如何实现跨平台的文件读写进度监听器回调机制【实战】
jvm·数据库·python
一铭111995 分钟前
gpt-claude-gemini 超级大模型安装使用教程
java·python·gpt·ai编程·claude·gemini
weisian1516 分钟前
Java并发编程--44-分布式限流:令牌桶与漏桶算法在网关层的落地
java·分布式·令牌桶算法·漏桶算法·固定窗口算法·滑动窗口算法
SamDeepThinking7 分钟前
秒杀系统怎么区分真实用户和黄牛脚本?
java·后端·架构
2301_7926748610 分钟前
java学习day31(redis)
java·redis·学习
小碗羊肉11 分钟前
【从零开始学Java | 第四十一篇】深入多线程
java·开发语言
xuhaoyu_cpp_java12 分钟前
MyBatis学习(一)
java·经验分享·笔记·学习·mybatis
2401_8371638912 分钟前
HTML怎么标注字数限制提示_HTML实时字数统计占位【详解】
jvm·数据库·python
阿标的博客16 分钟前
Python学习(二):PyCharm的下载与安装
python