七行プログラミング part4
■ このスレッドは過去ログ倉庫に格納されています
0613デフォルトの名無しさん
NGNG縮め。
sub sox{($d,$s,$e)=@_;$t=1;@d=split//,$d;O:for(($C,$E,$A,$V,@A)=();($_=shift@d)
ne'';){$n=0;/</?$n=$d[0]eq'/'?(shift@d,4):1:$C.=$_ if$t&1;/>/?$t=4:$E.=$_ if$t&
16;/\s/ or$t=8if$t&128;($t&4?$e:$s)->($C,$E,@A),(m|/|&&$t&2&&''ne$E)?$t=4:($t=1
,goto O)if$t&14&&/>|\//;/\s/?$n=2:$E.=$_ if$t&2;/=/?$n=2:$A.=$_ if$t&8;$n=1,
/["']/?$q=$_:($V.=$_,$q='\s')if$t&32;/$q/?(@A=(@A,$A,$V),$n=1,$A=$V=''):($V.=$_
)if$t&64;$t<<=$n}}
別アプローチ。
use strict;sub P{my($t,@t)=pop;while($t=~m!<([^\s>]+)([^>]+)?>(.*?)</\1>|([^<]+
)!gsx){my($E,$A,$C,$c,%A)=($1,$2,$3,$4);($A{$1}=$2)=~s/^(["'])(.*)\1\z/$2/while
$A=~/(\S+?)=("[^"]*"|'[^']*'|\S+)/gs;push@t,""ne$E?{e=>$E,a=>\%A,c=>P($C)}:$c}\
@t}sub S{my($t,$i)=@_;for(@{$t}){if(ref){no strict"vars";local($E,*A,$C)=@{$_}{
e=>a=>'c'};print"$i$E>\n",map"$i $_=$A{$_}\n",sort keys%A;S($C,$i." ")}else{s/
(?<=\n)./$i$&/gx;s/\s+\z//;print"$i$_\n"}}}
S P <<'XML';
...
XML
うーん。
■ このスレッドは過去ログ倉庫に格納されています