0

テンプレートファイル()のコマンドのリストを変換し、出力ファイル()で別の形式で別のファイルに出力するperlスクリプトを作成しています。

テンプレートファイルのコマンドは次のようになります。

command1 --max-size=2M --type="some value"

この文字列からオプションと値を抽出する際に問題が発生しました。これまでのところ私は持っています:

m/(\s--\w*=)/ig

どちらが返されますか:

" --max-size="
" --type="

ただし、オプションと値の両方を個別の変数として返す方法や、引用符の使用に対応する方法がわかりません。

誰かが私を正しい方向に導くことができますか?

補足:Getopsがコマンドラインからこれを行うのに素晴らしい仕事をしていることは知っていますが、残念ながらこれらのコマンドは文字列として渡されます:(

4

3 に答える 3

3

Getopt::StdまたはGetopt::Long

このオプションまたはこれを見たことがありますか?

車輪の再発明をする理由はないようです。

于 2012-11-17T23:19:34.343 に答える
0
use Data::Dumper;
$_ = 'command1 --max-size=2M a=ignore =ignore --switch --type="some value" --x= --z=1';
my %args;
while (/((?<=\s--)[a-z\d-]+)(?:="?|(?=\s))((?<![="])|(?<=")[^"]*(?=")|(?<==)(?!")\S*(?!"))"?(?=\s|$)/ig) {
  $args->{$1} = $2;
}
print Dumper($args);

---

$VAR1 = {
          'switch' => '',
          'x' => '',
          'type' => 'some value',
          'z' => '1',
          'max-size' => '2M'
        };

(ここでこのデモをテストしてください)

于 2012-11-17T13:54:38.117 に答える
0

以下のコードは

@args = ('command1', '--max-size=2M', '--type=some value');

これは、次のように渡すのに適してGetOptionsいます。

local @ARGV = @args;
GetOptions(...) or die;

最後に、コード:

for ($cmd) {
   my @args;
   while (1) {
      last if /\G \s* \z /xgc;

      /\G \s* /xgc;

      my $arg;
      while (1) {
         if (/\G ([^\\"'\s]) /xgc) {
            $arg .= $1;
         }
         elsif (/\G \\ /xgc) {
            /\G (.) /sxgc
               or die "Incomplete escape";

            $arg .= $1;
         }
         elsif (/\G (?=") /xgc) {
            /\G " ( (?:[^"\\]|\\.)* ) " /sxgc
               or die "Incomplete double-quoted arging";

            my $quoted = $1;
            $quoted =~ s/\\(.)/$1/sg;

            $arg .= $quoted;
         }
         elsif (/\G (?=') /xgc) {
            /\G ' ( [^']* ) ' /xgc
               or die "Incomplete single-quoted arging";

            $arg .= $1;
         }
         else {
            last;
         }
      }

      push @args, $arg;
   }

   @args
      or die "Blank command";

   ...
}
于 2012-11-17T14:13:42.703 に答える