Perl脚本搜索指定字符串并打印行无输出问题求助
Perl字符串匹配脚本无输出问题修复
核心问题与修复步骤
输入字符串带换行符(最可能的原因)
从<STDIN>读取的内容会包含用户输入时按下的换行符\n,直接用这个字符串做正则匹配,只会命中末尾带相同换行且包含输入内容的行,几乎不可能匹配成功。解决方法是用chomp去掉换行:my $name = <STDIN>; chomp $name; # 关键修复:去除末尾的换行符文件打开方式不规范
你使用的两参数open在严格模式下存在安全风险,建议改用Perl推荐的三参数打开方式,同时使用词法文件句柄(代替全局FH),这样脚本结束时会自动关闭文件,无需手动执行close:open(my $fh, '<', $file) or die "无法打开文件 $file: $!";可选优化:匹配灵活性
如果需要忽略大小写匹配,可以在正则后加i修饰符:if ($line =~ /$name/i)另外变量名尽量符合Perl惯例,比如把
$String改成$line,提升代码可读性。
完整修复后的代码
#!/usr/bin/perl use strict; use warnings; sub main { print "请输入姓名或部分内容: "; my $name = <STDIN>; chomp $name; # 去除输入末尾的换行符 my $file = '/home/jake/Downloads/phones'; # 安全的三参数文件打开方式 open(my $fh, '<', $file) or die "无法打开文件 $file: $!"; while (my $line = <$fh>) { # 匹配包含目标字符串的行,可加i修饰符忽略大小写 if ($line =~ /$name/) { print $line; # 行本身已带换行,无需额外添加\n } } } main();
内容的提问来源于stack exchange,提问作者Jake
相关产品推荐
相关产品推荐

