使用Getopt :: Long将值分配给同一个变量

时间:2016-08-09 09:04:43

标签: perl getopt-long

我试图编写一个小的perl脚本来理解Getopt::Long

以下是剧本:

#!/usr/bin/perl

use strict;
use Getopt::Long;

my $op_type = "";
my @q_users;

GetOptions (
  'query' => $op_type = "query",
  'create' => $op_type = "create",
  'modify' => $op_type = "modify",
  'delete' => $op_type = "delete",
  'user=s' => \@q_users
) or usage ("Invalid options.");

print "operation : $op_type\n";

当我运行此脚本时,如下所示:

$ ./all_opt.pl --query
operation : delete

我假设我的程序中缺少某种破坏声明。我期待operation : query作为结果。

请告诉我这里缺少的东西。

2 个答案:

答案 0 :(得分:5)

你非常接近,但我认为你有点误读Getopt::Long documentation。找到选项时要运行的任何代码都需要在子例程中。

#!/usr/bin/perl

use strict;
use Getopt::Long;

my $op_type = "";
my @q_users;

GetOptions (
  'query'  => sub { $op_type = 'query' },
  'create' => sub { $op_type = 'create' },
  'modify' => sub { $op_type = 'modify' },
  'delete' => sub { $op_type = 'delete' },
  'user=s' => \@q_users
) or usage ("Invalid options.");

print "operation : $op_type\n";

请注意,我刚刚在您现有的sub { ... }代码中添加了$op_type = '...'

答案 1 :(得分:4)

解释您的代码的作用

你误解了语法。让我们添加一些括号来阐明Perl如何看待这段代码。

GetOptions(
  'query'  => ( $op_type = "query"  ),
  'create' => ( $op_type = "create" ),
  'modify' => ( $op_type = "modify" ),
  'delete' => ( $op_type = "delete" ),
  'user=s' => \@q_users
) or usage ("Invalid options.");

它将首先在parens中运行赋值操作。其中每个都返回分配给$op_type的值。

$ perl -e 'print $foo = "bar"'
bar

由于它们都为同一个变量赋值,因此代码与此代码相同。

GetOptions(
  'query'  => "query",
  'create' => "create",
  'modify' => "modify",
  'delete' => "delete",
  'user=s' => \@q_users
) or usage ("Invalid options.");
$op_type = "delete";

GetOptions希望您传递对变量的引用,以便它可以为您分配变量值。但是,您只对user \@q_users进行此操作。其余的只是字符串。

最后,您将打印$op_type的值,该值始终具有上次分配的值。如上所述,删除。它不能是其他任何内容,因为GetOptions永远不会引用$op_type,因此无法分配。