引言
记录自己跳进的【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 文件中内容:
如果你的代码是这么写的:
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;
那么你得到的结果是:
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。代码:
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
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”