[英]“Use of uninitialized value in scalar chomp” in Perl
当我运行脚本时,我得到以下错误:有人可以帮助我
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);
}
该程序在命令行上需要参数 - 用户,型号名称和应用程序 - 并且您没有提供参数
有没有必要chomp
从命令行传递的值,因为它永远不会在一个新行结束
你的代码写得更好
usage() unless @ARGV == 3;
my ($user, $modelName, $Application) = @ARGV;
您可以在运行程序时在命令行上输入三个参数。 但是,没有检查您是否在程序中这样做。 因此,如果没有第一个参数, $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
语句中。
另外,在子程序中打印任何东西都是不好的形式。 子程序应该返回调用程序可以操作的值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.