我有一个班级,我们正在学习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;不存在。
答案 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;
}