全局符号在使用" my"时需要包名称。在子

时间:2015-09-22 18:10:38

标签: perl global-variables subroutine

我有一个班级,我们正在学习Perl,所以请原谅我,如果我做了一个简单/明显的错误,因为我还在学习。我的问题是为什么我会收到错误

  

Global Symbol"%localhash"需要显式包名称

以及" $ param"的相同错误当我用"我的%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;
}

在我的课堂上,我们假设使用&#34;我的$ param&#34;和#34;我的%localhash&#34;不同的时间,所以我会重复同样的过程来宣布&#34;我的&#34;在每个Sub中,但我一直得到同样的错误,好像&#34; my&#34;不存在。

2 个答案:

答案 0 :(得分:4)

您获得的第一个错误是syntax error at foo.pl line 13, near "my ";获取语​​法错误会导致perl的解析器关闭,之后由于未成功识别声明或误认为范围,您通常会收到虚假错误。忽略它们并修复语法错误(在这种情况下实际上是前几行:Sub而不是sub,如工具所指出的那样。这会让你接下来的错误:)

其他评论:

使用last就好了;它将退出循环,但代码中没有循环。如果从循环内调用你的sub,它将(带有警告)退出你的sub并退出那个循环,但这是一种导致bug的距离的动作。

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

答案 1 :(得分: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;
}