我正在学习一些代码,我想运行一个搜索文件的子例程。如果名称存在,我希望它打印名称。如果名称不存在,我希望它打印未找到。但是我遇到的问题是它是在找到文本但未找到文本时找到的打印
Not found
found Trevor
Not found
Not found
Not found
found Trevor
我想要的是找到的名字,但我不希望找不到。同样,当字符串不存在时,我只想要一个未找到的字符串。我意识到问题是我的while循环和if else语句。但是我找不到一个符合我想要的安排。这是我目前的代码;
sub search(){
open(FILE, "list.txt");
print("\n Search for subscriber\n\n");
my $search = <STDIN>;
while ($line = <FILE>){
if ( $line =~ /$search/) { print "found $search\n" }
else {
print("Not found \n");
Perl代码看起来像这样。是的,三个关闭支撑是不平衡的
sub search() {
open( FILE, "list.txt" );
print("\n Search for subscriber\n\n");
my $search = <STDIN>;
while ( $line = <FILE> ) {
if ( $line =~ /$search/ ) {
print "found $search\n";
}
else {
print("Not found \n");
答案 0 :(得分:0)
子程序是不必要的,不适合这个。但是,你没有充分说明你的情况,我可以提出更好的建议
这有效
onclick="startTimer(0,5)"
答案 1 :(得分:-1)
据我了解您的Q,您只想打印一次是否给定字符串,例如'Trevor',包含在您的输入文件中。这类似于shell命令grep Trevor list.txt
(或grep -q
)。
@toolic和@borodin已经讲过chomp()
。它会从您的输入中删除尾随的\n
字符($search
)并且是必需的,因为您实际上正在搜索只会在文件行末尾匹配的Trevor\n
。
如果你只想打印一次,那么只需添加一个(布尔)变量,迭代文件(不打印),最后根据标志打印。找到字符串后,您可以停止迭代。这是while循环中的last;
:它离开了循环。进一步的迭代不会改变结果,所以我们可以跳过它们。
在Perl中总有许多其他可能性来完成你的任务,但我试图尽可能地接近你的尝试。
把它放在一起:
#!/usr/bin/env perl
use strict;
use warnings;
sub search
{
print("\n Search for subscriber\n\n");
my $search = <STDIN>;
chomp($search);
my $found = 0;
open( my $fh, '<', 'list.txt' ) or die "cannot open list.txt: $!\n";
while ( my $line = <$fh> ) {
if ( $line =~ /$search/ ) {
$found = 1;
last;
}
}
close($fh);
if ($found) {
print "found $search\n";
} else {
print "Not found\n";
}
}