七行プログラミング part4
■ このスレッドは過去ログ倉庫に格納されています
0609デフォルトの名無しさん
NGNGsub sox{($d,$s,$e)=@_;$t=1;@d=split//,$d;O:for($C=$E=$A=$V='',@A=();($_=shift
@d)ne'';){$n=0;if($t&1){/</?$n=$d[0]eq'/'?((shift@d),4):1:$C.=$_}/>/?$t=4:$E
.=$_ if($t&16);if($t&128){$t=8 if(!/\s/)}if($t&14){if(/>|\//){($t&4?$e:$s)->(
$C,$E,@A);(/\//&&$t&2&&''ne$E)?$t=4:($t=1,goto O)}}if($t&2){/\s/?$n=2:$E.=$_}
if($t&8){/=/?$n=2:$A.=$_}$n=1,($_=~/["']/)?$q=$_:($V.=$_,$q='\s')if($t&32);
/$q/?(@A=(@A,$A,$V),$n=1,$A=$V=''):($V.=$_)if($t&64);$t<<=$n}}
# デモ
$start = sub { my($cont,$elem,@attr)=@_;
$cont=~tr/\n//d;print"$idt:$cont\n"if($cont ne'');
print"$idt<$elem>\n";
while($#attr>=0){printf("$idt %s: %s\n",shift@attr,shift@attr)}
$idt.=' ';
};
$end = sub { my($cont,$elem)=@_;
$cont=~tr/\n//d;print"$idt:$cont\n"if($cont ne'');
$idt=substr($idt, 4);
print"$idt</$elem>\n";
};
sox(<<'END_XML', $start, $end);
<html><head><title>7行XMLパーサ</title></head>
<body style="background=#FFF;color=#000">
<p>暇に任せて<em>SOXパーサ</em>(sox関数が6行)です (<a
href='http://pc2.2ch.net/test/read.cgi/tech/1051703369/l50'
title="七行プログラミング part4">投稿先</a>)</p><hr/>
<p>実体参照使用不可。大ざっぱにWell-formedな<acronym>XML</acronym>を
対象にしていますが、validateは無理。=の前後のスペースに弱いです。</p>
<p>疲れた (;´Д`)</p>
</body></html>
END_XML
■ このスレッドは過去ログ倉庫に格納されています