あなたの天然記念物
ホーム更新雑談Perl鉄ゲタランドナーコースガイド自転車Linuxリンク経歴連絡先

Getopt::Longの文字デコード処理と値の受付方法 (2017.08.03)

背景

興味深いツイートと、それの調査で見つけたブログがあったので。


Perlでコマンドラインオプションの解析に Getopt::Long を使う時、絶対に忘れてはいけない引数 - たごもりすメモ

コード

@ARGVの文字コード変換を全自動でやってくれるパッケージEncode::Argvを追加しました。 WindowsのActivePerlで動作確認しています。 コマンドプロンプトがcp932(シフトJISっぽい奴)なので文字コード変換が分かりやすいです。 Linuxで動作させたスクリプトを元にした都合で1行目がperlbrew用になっています。
ブログの方は文字列を受け取る指定を追加しました。これだけでよいのか怪しいです。 根本的にブログ投稿者の意図を読めていない可能性が高く自信がありません。
#!/usr/bin/env perl

use utf8;
use warnings;
use strict;
use open IO => ":utf8";

use Encode::Argv;
use Encode::Locale;
use Getopt::Long;

binmode STDOUT, ":encoding(console_out)";

$| = 1;

my $text = "(none)";
my $opt = 0;

GetOptions("text=s" => \$text, "opt" => \$opt);

print "テキスト = '$text'\n";
print "オプション = $opt\n";

exit;

動作結果

C:\??????????>perl sample_6.pl
テキスト = '(none)'
オプション = 0

C:\??????????>perl sample_6.pl --text 本日は晴天なり
テキスト = '本日は晴天なり'
オプション = 0

C:\??????????>perl sample_6.pl --opt
テキスト = '(none)'
オプション = 1

C:\??????????>perl sample_6.pl --text 本日は晴天なり --opt
テキスト = '本日は晴天なり'
オプション = 1

C:\??????????>perl sample_6.pl --opt --text 本日は晴天なり
テキスト = '本日は晴天なり'
オプション = 1

C:\??????????>