2016-11-17 170 views
-1

我正在做一项任务,要求使用/etc中的passwd文件在文件中搜索用户。字符串比较和if语句

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

这里是我的代码:

#!/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,但是当我做,它说,每一个参数没有找到,即使我知道它的存在。

我试图在我的书中看,并没有运气在网上研究它。

+0

'@ARGV [0]'不会工作,因为'ARGV [0]'是标量,而不是一个数组。您可能是指您在第一次检查时使用的“$ ARGV [0]”。另外,你似乎在'$ field [0]'后面缺少一个关闭的元素。考虑在脚本的顶部添加'使用警告'。 –

+0

我会试试,谢谢 – user4839691

+0

你是否清楚'while(){...}'会为文件中的每一行执行一次块? – Borodin

回答

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" 
} 
+0

当我键入代码时,它仍然以相同的方式发生。如果找不到用户,则不显示打印。 – user4839691

+0

也许你打错了什么。 $ found设置为0,那么只有在找到用户的情况下它才会变为1。最后,如果$ found是0,它会打印出来。我测试过了。这个对我有用。你的版本没有工作,因为有几个错误,缺少半个图标,@ARGV [0]而不是$ ARGV [0],缺少“)”,“〜=”而不是“ne”。 – quantummind

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" 
} 
+0

所以我对PERL很新颖。我完全没有在课前用过它。好吧,所以我试图按照你的伪代码来构造它。但它给了我错误信息 – user4839691

+0

好吧,这是因为我忘了添加$。现在让我试试吧 – user4839691

+2

@ user4839691:认识到你不应该在每次从输入文件中读取一行时检查参数的数量,或者你必须阅读您可以知道用户是否被找到之前文件的结尾。你知道什么语言? – Borodin