繁体   English   中英

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

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

还有一件事...

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM