希望在文本文件

时间:2016-06-09 18:04:29

标签: perl

我正在学习一些代码,我想运行一个搜索文件的子例程。如果名称存在,我希望它打印名称。如果名称不存在,我希望它打印未找到。但是我遇到的问题是它是在找到文本但未找到文本时找到的打印

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");

2 个答案:

答案 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";
    }
}