存在声明不工作perl

时间:2013-06-28 02:18:07

标签: perl exists

这是一项家庭作业。我不是在寻找“使其工作的代码”更多地寻找正确方向上我的逻辑错误的点。

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

2 个答案:

答案 0 :(得分:4)

表达式'$ nam'的值是这四个字符本身。表达式“$ nam”的值是变量$ nam的值,表示为字符串。

双引号允许字符串插值。单引号不;你得到你输入的内容。

答案 1 :(得分:1)

正如你所写:

my %nacheck;
if( exists ($nacheck { '$nam' } )){
    next;
}
$nacheck{ "$nam" } = 1;

%nacheck是新创建的,必须为空。因此exists测试失败。

或者您是否刚刚在示例中显示了与测试相邻的定义?

如果是这样,您能告诉我们您的代码实际上是什么样的吗?

编辑:此外,正如Charles Engelke所说,你在变量'$nam'周围使用单引号是错误的。