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

相关推荐
PILIPALAPENG16 小时前
Python 语法速成指南:前端开发者视角(JS 类比版)
前端·人工智能·python
她的男孩17 小时前
从零搭一个企业后台,为什么我把能力拆成 Starter 和 Plugin
java·后端·架构
RainCity17 小时前
Java Swing 自定义组件库分享(七)
java·笔记·后端
Sam_Deep_Thinking17 小时前
连锁门店的外卖订单平台对接
java·微服务·架构·系统架构
_遥远的救世主_17 小时前
从一次结果集密集型查询 OOM 看 Java 服务的稳定性架构治理
java·后端
用户83562907805117 小时前
Python 操作 PowerPoint 页眉与页脚指南
后端·python
一楼的猫17 小时前
从工具链视角对比:番茄作家助手 vs 第三方写作辅助方案
java·服务器·开发语言·前端·学习·chatgpt·ai写作
枫叶林FYL18 小时前
项目九:异步高性能爬虫与数据采集中枢 —— 基于 Crawl<sub>4</sub>AI 与 Playwright 的现代化数据采集平台 项目总览
爬虫·python·深度学习·wpf
likerhood18 小时前
Java static 关键字从浅入深
java·开发语言
猫猫的小茶馆18 小时前
【Python】函数与模块化编程
linux·开发语言·arm开发·驱动开发·python·stm32