2015-09-22 31 views
-1

我有一个我们正在学习Perl的课程,所以如果我在我仍然学习时犯了一个简单/明显的错误,请原谅我。我的问题是,为什么我得到的错误全球符号需要包名称,当使用“我的”在Sub

全局符号“%localhash”需要明确的包名

以及为“$参数”当我与声明它同样的错误“我%localhash“在Sub中第一次。

我参考代码:

use strict; 
use warnings; 
use Exporter; 
use vars qw(@ISA @EXPORT); 

@ISA=qw(Exporter); 
@EXPORT=("insert_user", "modify_user", "remove_user", "generate_list"); 


#Insert user Function 
Sub insert_user{ 
    my $param = shift; 
    my %localhash = %$param; 
    print "Please enter Username: "; 
    my $user_name = <>; 
    chomp($user_name); 
    if(exists ($localhash{$user_name})){ 
     print "Error, user already exists!"; 
     last; 
    } 
    $user_name =~ s/[^a-zA-Z0-9]//g; 
    $user_name = lc($user_name); 
    $localhash{$user_name}; 
    return %localhash; 
    print "Please enter a password: "; 
    my $user_password = <>; 
    %localhash{$user_name} = $user_password; 
    return %localhash; 
} 

在我的课堂上,我们是想用“我的$参数”和“我的%localhash”不同的时间,所以我会重复同样的过程在“我”的声明每个小组,但我不断得到相同的错误,就好像“我的”不在那里一样。

+3

'%localhash {$ USER_NAME} = $ USER_PASSWORD;' - 这条线应该是'$ localhash {$ user_name}',不是?你为什么基本上破坏了代码而不是'return%localhash;'在它的中间? ) – raina77ow

+2

'Sub'应该是'sub' – toolic

+1

,你不应该在循环之外使用最后一个 – ysth

回答

4

第一个你得到的错误是syntax error at foo.pl line 13, near "my ";得到一个语法错误会抛出perl的解析器,之后你会经常得到错误的错误,因为它没有成功地识别出声明或误认为范围。忽略它们并修复语法错误(在这种情况下,实际上是前几行:Sub而不是sub,正如工具所指出的那样)。这将让你到下一个错误:)

其他评论:

使用last为你做的是坏的;它会退出一个循环,但代码中没有循环。如果你的子从一个循环中被调用,它会(随着一个警告)退出你的sub并退出循环,但这是在远处导致错误的那种动作。

很长一段时间,出口商不需要被分类;只需use Exporter 'import';而不是设置@ISA

+0

非常感谢你们!是的,问题在于,因为它是Sub而不是Sub并且没有继续,所以修复它也发现了一些更小的错误。再次感谢你。 –

+0

在这种情况下,我最好让程序重新启动,如果if(exists($ localhash {$ user_name}))'= true? –

+0

我可能会让它只是做'return;'并且在调用者中,做一些类似于'%user = insert_user(...)或last'的事情......' – ysth

0

Sub问题外,您还有%localhash{$user_name}而不是$localhash{$user_name};你检查你的用户名是否已经存在 之前你去掉非字母数字字符和小写字母,这是错误的;并且您未输入chomp密码。你也有很小的空白,它可以使程序更可读

这有点像什么,我会写

use strict; 
use warnings; 

use Exporter qw/ import /; 

our @EXPORT = qw/ insert_user modify_user remove_user generate_list /; 

sub insert_user { 
    my ($param) = @_; 
    my %localhash = %$param; 

    print "Please enter user name: "; 
    my $user = <>; 
    chomp $user; 

    $user =~ s/[^a-zA-Z0-9]//g; 
    $user = lc $user; 
    if (exists $localhash{$user}) { 
     warn "Error, user already exists!"; 
     return; 
    } 

    print "Please enter a password: "; 
    my $pass = <>; 
    chomp $pass; 
    $localhash{$user} = $pass; 

    return %localhash; 
} 
相关问题