我在运行脚本时遇到以下错误:有人可以帮助我吗
Use of uninitialized value $user in scalar chomp at ./temp.pl line 38, <DATA> line 558.
Use of uninitialized value $modelName in scalar chomp at ./temp.pl line 39, <DATA> line 558.
Use of uninitialized value $Application in scalar chomp at ./temp.pl line 40, <DATA> line 558.
Use of uninitialized value $user in string eq at ./temp.pl line 42, <DATA> line 558.
代码如下,有人可以帮助我:
my ($user) = $ARGV[0];
my ($modelName) = $ARGV[1];
my ($Application) = $ARGV[2];
chomp($user);
chomp($modelName);
chomp($Application);
if ( ($user eq "") || ($modelName eq "") || ($Application eq "")) {
&usage;
}
sub usage {
print "\tUsage : $0 User ModelName Application\n";
exit (1);
}
答案 0 :(得分:4)
程序在命令行中需要参数 - 用户,型号名称和应用程序 - 并且您没有提供
不需要chomp
从命令行传递的值,因为它永远不会以新行结束
你的代码写得更好
usage() unless @ARGV == 3;
my ($user, $modelName, $Application) = @ARGV;
答案 1 :(得分:0)
您可以在运行程序时在命令行上输入三个参数。但是,没有检查您是否在程序中这样做。因此,如果没有第一个参数,$ARGV[0]
为空,$user
也是如此。当您chomp
用户时,您会收到错误消息。这是程序的略微修改版本:
use strict;
use warnings;
# Let's give some directions
my $usage <<USAGE;
Usage: <program> <user> <model> <application>
All parameters are required!
USAGE
if (scalar @ARGV != 3) {
die "$usage";
}
my $user = shift;
my $modelName = shift;
my $Application = shift;
# No need for this
chomp $user;
chomp $modelName;
chomp $Application;
请注意以下几点:
use strict
和use warnings
个pragma。始终在所有程序中使用这些。这些帮助发现了人们在程序中犯下的大约90%的错误。scalar
强制@ARGV
给我标量值(在这种情况下它会做什么),并查看其中是否有三个且只有三个值。如果没有三个值,我会给出使用文本。<...>
如果该行仅为空白则不返回零。如果该行为空白,则会<...>
至少返回一个NL字符。还有一件事......
我喜欢使用$usage
文本而不是子例程。我在我的程序的最顶部设置了使用文本,其中查看我的代码的人可以看到它,并准确读取程序的使用方式。我也可以将我的用法文本放在die
语句中。
另外,在子程序中打印任何东西都是不好的形式。子程序应该返回调用程序可以操作的值。