字符串比较和if语句

时间:2016-11-17 23:15:48

标签: perl

我正在执行一项任务,要求使用passwd中的/etc文件在文件中搜索用户。

我能够做到这一点,但是当它找不到特定的用户时,它不会回复我使用过的打印命令。

这是我的代码:

#!/usr/bin/perl

$file = '/etc/passwd.bak'
open ( FILE, $file ) or die "Error in reading file. Program will close";

while ( <FILE> ) {

    chomp;
    @field = split ( ':', $_ );

    if ( $ARGV[0] eq $field[0] ) {
        print "User ID: $field[2]\n" ;
        print "Home Directory: $field[5]\n";
    }
    elsif ( @ARGV[0] ~= $field[0] {
        print "User: $ARGV[0] does not exist.\n"
    }
    elsif ( (@ARGV > 1 || @ARGV == 0 ) ) {
        print "Please enter one argument only.\n";
        exit 0;
    }
}

我已经尝试为!=交换ne,但是当我这样做时,它表示即使我知道它在那里也找不到每个参数。

我试图查看我的书,并在网上进行研究,但没有运气。

2 个答案:

答案 0 :(得分:0)

对于初学者来说,ne是比较字符串是否相等的正确运算符。你可能意味着$field[0] ne $ARGV[0]

除此之外,您的代码存在一些结构性问题。首先,检查文件读取while循环内的参数计数。参数检查应该是脚本的第一件事,而不是它在处理时所做的事情。其次,因为“不存在”检查在while循环内部,所以您将为不是用户的每一行输出该消息。如果您的输入文件有100行,而其中一行是您的搜索目标,您将输出一条匹配消息和99“不存在”消息。

我建议使用如下结构。因为这是作业,应该是学习经验,我只给你伪代码,而不是perl。

if ( wrong_param_count ) {
    print "error message"
    exit
}

found_user = 0
while ( read_line_from_file ) {
    if ( this_line_is_user ) {
        print "user information here"
        found_user = 1
    }
}

if ( !found_user ) {
    print "user not found"
}

答案 1 :(得分:0)

通常参数检查在开始时发生,而不是在循环中发生。

您可以说用户仅在循环后才存在。

您应该使用$ ARGV [0]而不是@ARGV [0]。

我试图让程序按照你的描述进行操作:

#!/usr/bin/perl

if ((@ARGV > 1 || @ARGV == 0)) {
        print "Please enter one argument only.\n";
        exit 0;
}

$file = '/etc/passwd';
open( FILE, $file ) or die "Error in reading file. Program will close";
$found =0;
while ( <FILE> ) {
        chomp;
        @field = split ( ':', $_ );

        if ($ARGV[0] eq $field[0] ) {
                print "User ID: $field[2]\n" ;
                print "Home Directory: $field[5]\n";
                $found = 1;
        }
}
if ($found == 0) {
        print "User: $ARGV[0] does not exist.\n"
}