Perl中“在标量chomp中使用未初始化的值”

时间:2012-08-06 03:00:33

标签: perl chomp

我在运行脚本时遇到以下错误:有人可以帮助我吗

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

2 个答案:

答案 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 strictuse warnings个pragma。始终在所有程序中使用这些。这些帮助发现了人们在程序中犯下的大约90%的错误。
  • 我在做其他事之前检查参数是否存在。我使用scalar强制@ARGV给我标量值(在这种情况下它会做什么),并查看其中是否有三个且只有三个值。如果没有三个值,我会给出使用文本。
  • 您无需选择命令行参数。仅在文件输入时才需要Chomping,因为每个文件行都使用其EOL字符或字符读入。这主要是为了确保<...>如果该行仅为空白则不返回零。如果该行为空白,则会<...>至少返回一个NL字符。

还有一件事......

我喜欢使用$usage文本而不是子例程。我在我的程序的最顶部设置了使用文本,其中查看我的代码的人可以看到它,并准确读取程序的使用方式。我也可以将我的用法文本放在die语句中。

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