如何在Perl中为子例程使用switch类型参数

时间:2012-03-23 05:56:20

标签: perl perl-module

我想在Perl中调用子例程,如:

sub temp {
  ---- some code -----
}
temp(-switchName, value1, --switchName2, value2)

就像我知道Getopt :: Long是命令行开关类型参数。 所以我想知道子程序类型的参数。

2 个答案:

答案 0 :(得分:3)

为什么人们可能想要这样做有很多原因,但你没有这么说,我将不得不推测一些。

在命令行上切换很有用,因为命令行程序会将选项与参数列表混淆,需要某种方式来了解差异。因此,“以 - 开头的事物 - 不是常规参数”惯例。

command --key value --key2 value2 file1 file2 file3
command file1 --key value file2 --key2 value2 file3

你当然可以用子程序做类似的事情,在那里它选择查找以--开头的事物的参数列表,并暗示列表中的下一个是关联的值...但子程序有更好的更简单的方法。

temp( ["file1", "file2", "file3"], { something => 1 } );

在这种情况下,主要的参数列表首先作为数组引用传递,并且选项在散列引用中传递第二个。没有歧义。

sub temp {
    my($files, $options) = @_;

    print "Something!\n" if $options->{something};

    for my $file (@$files) {
        ...do something with $file...
    }
}

您甚至可以更进一步,并将所有内容作为选项传递。

temp( files => ["file1", "file2", "file3"], something => 1 );

sub temp {
    my %args = @_;

    print "Something!\n" if $args{something};

    for my $file (@{$args{files}}) {
        ...do something with $file...
    }
}

如果不清楚什么是选项以及什么是参数,这是有用的。这里的“带选项的文件列表”可能有点过分。

答案 1 :(得分:2)

如果我理解正确,您可以将参数传递给哈希并使用它来访问它们。像那样:

sub temp {
  my %opts = @_;

  if ($opts{'-switch1'}) {
    # ... do something ...
  }

  ...
}

temp(-switch1 => 1);
# or
temp(-switch1, 1);