概要

  • 正規表現によるマッチ結果をリスト化する。
  • リストコンテキストで /g を付けて評価する。

ソース

  • matchlist.zip
    # マッチ結果のリスト化
    # リストコンテキストで /g を付けて評価する。
    
    use strict;
    use warnings;
    use utf8;
    use Encode;
    
    #my $charsetConsole	= 'UTF-8';
    my $charsetConsole	= 'CP932';
    my $charsetFile		= 'UTF-8';
    
    binmode( STDIN,  ":encoding($charsetConsole)" );
    binmode( STDOUT, ":encoding($charsetConsole)" );
    binmode( STDERR, ":encoding($charsetConsole)" );
    
    # 次の文字列を「key=val」として分解する
    # key は空白を含みうる。val は空白を含まない。
    # 「t u」はマッチしないので無視される
    my $line = "aa = bb cc dd= ee ff gg hh= ii jj kk = ll mm=nn o= p q r= s t u";
    print "${line}\n\n";
    
    # ペア単位でリスト化した後、key/valに分解。順序は保存される。
    foreach my $pair ( $line =~ /[^=]*\S\s*=\s*\S+\s*/g ){
    	my( $key, $val ) = ( $pair =~ /^([^=]*\S)\s*=\s*(\S+)\s*$/ );
    	print "key:'${key}'\tval:'${val}'\n";
    }
    print "\n";
    
    # マッチ結果リストをハッシュとして受ける。順序は保存されない。
    my %pairs = ( $line =~ /([^=]*\S)\s*=\s*(\S+)\s*/g );
    foreach my $key ( keys( %pairs ) ){
    	print "key:'${key}'\tval:'${pairs{$key}}'\n";
    }
    
    # EOF

出力結果

aa = bb cc dd= ee ff gg hh= ii jj kk = ll mm=nn o= p q r= s t u

key:'aa'        val:'bb'
key:'cc dd'     val:'ee'
key:'ff gg hh'  val:'ii'
key:'jj kk'     val:'ll'
key:'mm'        val:'nn'
key:'o' val:'p'
key:'q r'       val:'s'

key:'jj kk'     val:'ll'
key:'mm'        val:'nn'
key:'q r'       val:'s'
key:'ff gg hh'  val:'ii'
key:'cc dd'     val:'ee'
key:'aa'        val:'bb'
key:'o' val:'p'

リンク