Getopt::Longの pass_throughオプションに関するメモ

おそらくはそれさえも平凡な日々: 2013年のGetopt::Long


でも紹介されている pass_throughに関するメモ。
pass_throughオプションを有効にするとオプション解析の終了を意味する
'--'が @ARGVに含まれます。


以下のようなコードの場合、

#!perl
use strict;
use warnings;

use Getopt::Long;

Getopt::Long::Configure(
    'pass_through',
);

local @ARGV = qw/-D=usethreads -D=use64bitint -- 5.16.2/;

my (@D);
Getopt::Long::GetOptions(
    'D=s@' => \@D,
);

print "\@D=(@D)\n";

my $version = shift;
print $version, "\n";


結果は以下のようになってしまいます。

% perl test.pl 
@D=(usethreads use64bitint)
-- # <= 意図しない

plenv, Perl::Buildで考慮されていなくて pull requestしたの
ですが、ベストな解決方法がわからなかったので以下のコードを
GetOptionsのあとに追加しました

shift @ARGV if @ARGV >= 1 && $ARGV[0] eq '--';


Getoptionsのオプションを設定するときはドキュメントをちゃんと
読んで使わないとハマりどころが多いなぁと思いました。人様の設定を
参考になんとなくオプションを設定していましたが、以後気をつけます。