我正在执行一项任务,要求使用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
,但是当我这样做时,它表示即使我知道它在那里也找不到每个参数。
我试图查看我的书,并在网上进行研究,但没有运气。
答案 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"
}