2

运行脚本时出现以下错误:有人可以帮我解决这个问题吗

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);
}
4

2 回答 2

4

该程序在命令行上需要参数 - 用户、模型名称和应用程序 - 而您没有提供任何参数

不需要chomp从命令行传递值,因为它永远不会以新行结尾

你的代码最好这样写

usage() unless @ARGV == 3;

my ($user, $modelName, $Application) = @ARGV;
于 2012-08-06T03:04:33.083 回答
0

假设您在运行程序时在命令行上输入了三个参数。但是,没有检查您是否在程序中这样做。因此,如果没有第一个参数,$ARGV[0]则为 null,而$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 strictuse warningspragmas。始终在所有程序中使用这些。这些有助于发现人们在程序中犯的大约 90% 的错误。
  • 在我做任何其他事情之前,我会检查论点是否存在。我过去常常scalar强制@ARGV给我它的标量值(在这种情况下它无论如何都会这样做),并查看其中是否实际上有三个并且只有三个值。如果没有三个值,我给出用法文本。
  • 您不需要 chomp 命令行参数。仅在文件输入时才真正需要 Chomping,因为每个文件行都使用其 EOL 字符或字符读入。这主要是为了确保<...>如果该行只是空白,则不会返回零。如果该行为空白,您将<...>至少返回一个 NL 字符。

还有一件事...

我喜欢使用$usage文本而不是子程序。我将使用文本设置在程序的最顶部,查看我的代码的人可以看到它,并准确阅读程序的使用方式。我也可以将我的使用文本放在一个die声明中。

另外,在子程序中打印任何东西都是不好的形式。子程序应该返回调用程序可以操作的值。

于 2012-08-06T04:03:53.050 回答