这是一项家庭作业。我不是在寻找“使其工作的代码”更多地寻找正确方向上我的逻辑错误的点。
use strict;
use warnings;
#rot13 sub for passwords
sub rot13{
my $result;
chomp(my $input = <STDIN>);``
# all has to be lower case
my $lower = lc $input;
my $leng = length $lower;
for(my $i = 0; $i < $leng; $i++){
my $temp = substr ($lower,$i,1);
my $con = ord $temp;
if($con >= '55'){
if($con >= '110'){
$con -= 13;
}
else{
$con += 13;
}
}
$result = $result . chr $con;
}
return $result;
};
#opening a file specified by the user for input and reading it
#into an array then closing file.
open FILE, $ARGV[0] or die "cannot open input.txt";
my @input = <FILE>;
close FILE;
my (@username,@password,@name,@uid,@shell,@ssn,@dir,@group,@gid);
my $ui = 100;
foreach(@input){
my ($nam, $ss, $gro) = split ('/', $_);
chomp ($gro);
$nam= lc $nam;
我创建了一个哈希,所以我可以使用exists函数然后使用该函数,如果它确实存在,则转到下一轮循环。我觉得我错过了这个。
my %nacheck;
if( exists ($nacheck { '$nam' } )){
next;
}
$nacheck{ "$nam" } = 1;
while (my ($key, $value) = each %nacheck){
print "$key => $value\n";
}
所有这一切现在都有效,但有关如何更好地做到这一点的任何提示都将得到应用
my($unf, $unm, $unl) = split (/ /, $nam);
$unf = (substr $unf,0,1);
$unm = (substr $unm,0,1);
$unl = (substr $unl,0,1);
my $un = $unf . $unm . $unl;
if(($gro) eq "faculty"){
push @username, $un;
push @gid, "1010";
push @dir, "/home/faculty/$un";
push @shell, "/bin/tcsh";
}
else{
my $lssn = substr ($ss,7,4);
push @username, $un . $lssn;
push @gid, "505";
push @dir, "/home/student/$un";
push @shell, "/bin/bash";
}
#pushing results onto global arrays to print out later
push @ssn, $ss;
my $pass = rot13;
push @password, $pass;
push @name, $nam;
push @uid, $ui += 1;
}
#printing results
for(my $i = 0; $i < @username; $i++){
print
"$username[$i]:$password[$i]:$uid[$i]:$gid[$i]:$name[$i]:$dir[$i]:$shell[$i]\n";
}
答案 0 :(得分:4)
表达式'$ nam'的值是这四个字符本身。表达式“$ nam”的值是变量$ nam的值,表示为字符串。
双引号允许字符串插值。单引号不;你得到你输入的内容。
答案 1 :(得分:1)
正如你所写:
my %nacheck;
if( exists ($nacheck { '$nam' } )){
next;
}
$nacheck{ "$nam" } = 1;
%nacheck
是新创建的,必须为空。因此exists
测试失败。
或者您是否刚刚在示例中显示了与测试相邻的定义?
如果是这样,您能告诉我们您的代码实际上是什么样的吗?
编辑:此外,正如Charles Engelke所说,你在变量'$nam'
周围使用单引号是错误的。