HTML::Parser version 3.15

by Hippo2000(2001/1/25)

HTML::Parserなのです。

なお内容等が間違っていたら修正します。ご連絡ください。


目次


名前

HTML::Parser - HTML パーサー・クラス


注意

これは新しいXSベースのHTML::Parserです。これはHTML::Parser バージョン2.2xと完全な後方互換ははずですが、多くの新しい機能を持ち、非常に速くなっています。


概要

 use HTML::Parser ();
 # パーサー・オブジェクトの作成
 $p = HTML::Parser->new( api_version => 3,
                         start_h => [\&start, "tagname, attr"],
                         end_h   => [\&end,   "tagname"],
                         marked_sections => 1,
                       );
 # Parse document text chunk by chunk
 $p->parse($chunk1);
 $p->parse($chunk2);
 #...
 $p->eof;                 # signal end of document
 # ファイルから直接解析する
 $p->parse_file("foo.html");
 # もしくは
 open(F, "foo.html") || die;
 $p->parse_file(*F);

HTML::Parser バージョン2スタイル のサブクラスかとメソッド・コールバック:

 {
    package MyParser;
    use base 'HTML::Parser';
    sub start {
       my($self, $tagname, $attr, $attrseq, $origtext) = @_;
       #...
    }
    sub end {
        my($self, $tagname, $origtext) = @_;
        #...
    }
    sub text {
        my($self, $origtext, $is_cdata) = @_;
        #...
    }
 }
 my $p = MyParser->new;
 $p->parse_file("foo.html");

説明

HTML::Parserクラスのオブジェクトはマークアップを理解し、それをHTMLドキュメントに入っている平文(別名データ内容)から切り離します。異なるマークアップとテキストが理解されると、対応するイベント・ハンドラが呼び出されます。

HTML::Parserは汎用的なSGMLパーサーではありません。実際に"存在する"HTMLを扱えるようにしてきました、そしてW3cからの多くのHTML仕様に厳密に従うのではなく、通常は一般的なWebブラウザがやるような方法に近い形で解析します。一致しない部分では、多くの場合、公式の動きをとれるようにするオプションがあります。

解析されるドキュメントは任意の形式で与えることができます。これによりネットーワークからドキュメントを受け取ったとき、その場で解析する解析することを可能にします。

イベント・ドリブンな解析があなたのアプリケーションに合わないと思うのでしたら、HTML::TokeParserを使いたいかもしれません。それはHTML::Parserのサブクラスで、より伝統的なプログラム構造を可能にします。


メソッド

以下のメソッドが新しいHTML::Parserオブジェクトを作成するために利用することができます:

$p = HTML::Parser->new( %options_and_handlers )
このクラス・メソッドは新しいHTML::Parserオブジェクトを作成し、それを返します。イベント・ハンドラを割り当てたり、パーサー・オプションを初期化するために、キー/値の組の引数を与えることができます。ハンドラとパーサー・オプションは以下に説明するメソッド呼出しにより、後で設定または変更することができます。

最上位のキーが"<イベント>_h"(例えば"text_h")であれば、そのイベントへのハンドラを割り当てます。そうでなければパーサー・オプションを初期化します。イベント・ハンドラに指定する値は、配列リファレンスでなければなりません。複数のハンドラを'handlers => [%handlers]' で割り当てることもできます。下記の例をご覧ください。

もし引数なしでnew()が呼ばれたら、それはHTML::Parserのバージョン2と互換性のあるコールバック・メソッドを使うパーサーを作成します。詳細は下記の"バージョン2との互換性"をご覧ください。

特殊なコンストラクタ・オプション 'api_version => 2'は、他のオプションやハンドラを設定しながら、バージョン2コールバックを初期化するために使われます。何もオプションを設定したくなく、そしてv2互換モードしたくなければ、'api_version => 3'オプションを使うことができます。

例:

 $p = HTML::Parser->new(api_version => 3,
                        text_h => [ sub {...}, "dtext" ]);

これは一般的なエンティティがデコードされた元のテキストを受け取るtextイベント・ハンドラ・サブルーチンを持った新しいパーサーを作成します。

 $p = HTML::Parser->new(api_version => 3,
                        start_h => [ 'my_start', "self,tokens" ]);

これは$pとトークン配列を受け取るstartイベント・ハンドラ・メソッドを持った新しいパーサーを作成します。

 $p = HTML::Parser->new(api_version => 3,
                        handlers => { text => [\@array, "event,text"],
                                      comment => [\@array, "event,text"],
                                    });

これはtextとcommentイベントでイベント・タイプと元のテキストを@arrayに格納する新しいパーサーオブジェクトを作成します・

以下のメソッドでHTML::ParserオブジェクトにHTMLドキュメントを食わせることができます。

$p->parse( $string )
$stringをHTMLドキュメントの次のチャンクとして解析します。戻り値は通常はパーサーオブジェクト(つまり$p)へのリファレンスです。呼び出されたハンドラは、$p->parseが返るまで、その場で$stringを変更しようとするべきではありません。

呼び出されたイベント・ハンドラが$p->eofにより解析を中断させたら、$p->parse()はFALSE値を返します。

$p->parse_file( $file )
ファイルからテキストを直接解析します。$file引数はファイル名、オープンされているファイル・ハンドルまたはオープンされているファイル・ハンドルへのリファレンスのいずれかにすることができます。

$fileにファイル名が入っていて、ファイルがオープンできなければ、メソッドは未定義値を返し、$!にはなぜ失敗したのかが入ります。そうでなければ、戻り値はパーサー・オブジェクトへのリファレンスです。

$file引数にファイルハンドルが渡されると、ファイルは通常はEOFまで読み込まれますが、クローズされません。

呼び出されたイベント・ハンドラが$p->eofにより解析を中断させたら、$p->parse_file()はファイル全体を読み込んでいないかもしれません。

複数バイトの行末文字を持つシステムでは、parse_fileがバイナリー・モードでないファイルハンドルで呼ばれているとoffsetとlength argspecsのために渡された値は、小さすぎるかもしれません。

$p->eof
HTMLドキュメントの終わりを知らせます。$p->eofメソッドをハンドラ・コールバックの外から呼び出すと、残りのバッファされているテキストがすべてフラッシュされます(これにより、残っているテキストがあるとtext イベントが発火します)

$p->eofをハンドラの内側から呼び出すと、解析をその時点で終了させ、$p->parseにFALSE値を返させます。これは$p->parse_file()による解析も終らせます。

戻り値はパーサー・オブジェクトへのリファレンスです。

ほとんどのパーサー・オプションはブール値の属性により制御されます。各ブール値の属性は対応するメソッドをTRUE引数で呼び出すことにより有効になり、引数値をFALSEで呼ぶことにより無効になります。引数なしであれば、属性値は変更されないままです。各メソッドからの戻り値は古い属性値です。

パーサー・オプションの取得 そして/または 設定に使えるメソッドは以下の通りです:

$p->strict_comment( [$bool] )
デフォルトでは、コメントは最初の"-->"によって終らされます。これはほとんどの一般的なブラウザ(NetscapeやMSIE)での動きです。しかしこれは公式のHTML標準では正しくありません。公式には、閉じ括弧">"の前に偶数の"--"トークンが理解され、そして偶数そして奇数の"--"の間の空白を除いて何もないと理解される必要があります。

この属性を有効にすることにより公式の動きが有効にすることができます。

$p->strict_names( [$bool] )
デフォルトでは、ほとんどすべてのものがタグそして属性名として許されます。この動きはほとんどの一般的なブラウザでの動きであり、これにより以下のような適切でない属性値を持っている壊れたタグを解析することを可能にします:
   <IMG SRC=newprevlstGr.gif ALT=[PREV LIST] BORDER=0>

デフォルトでは、"LIST]" は明らかに意図しているようなALT値の一部ではなく、ブール値の属性として解析されます。これはNetscapeでもそうなります。

この属性を有効にすることにより公式の動きが有効にすることができます。もし有効になると、"LIST]"が正しい属性名ではないために上位のタグはテキストとして報告されるようになります。

$p->boolean_attribute_value( $val )
このメソッドはHTML開始タグのなかで、ブール値の属性のために報告される値を設定します。デフォルトでは、その属性の名前がその値としても使われます。これは tokensattr argspecsのために報告される値に影響を与えます。
$p->xml_mode( [$bool] )
この属性を有効にすると、空要素タグそしてXML処理命令のようなXML構造を許すようにパーサーを変更します。それはtagnameattr argspecsにより報告されるとき、タグと属性の名前を小文字にすることをできなくさせ、HTMLのためのCDATAとして解析される要素の特殊な扱いを抑止します。

空要素タグは開始タグのように見えますが、文字の並びの最後に"/>"がつきます。HTML::Parserにより理解されるとき、startイベントとともに擬似的なendイベントを発生します。擬似的なendイベントのためのtextは空で、トークン配列での唯一の要素が正しいタグ名を持っているとしてもtokenpos配列は未定義になります。

XML処理命令はHTMLの場合での単なる">"の代わりに"?"で終ります。

$p->unbroken_text( [$bool] )
デフォルトではテキストのブロックは可能になるとすぐにtextハンドラに与えられます(しかしパーサーは1つの単語とエンティティが常に安全にデコードされるよう常にテキストは空白と非空白の区切りでブレークされることを保証します)。これはテキストでの変更をすることを難しくしてしまうブレークを作るかもしれません。この属性が有効であれば、テキストのブロックは常に1つのピースとして報告されます。これは後に続く(textでない)イベントがパーサーにより理解されるまで、textイベントが遅くなります。
 
$p->marked_sections( [$bool] )
デフォルトでは、<![CDATA[...]]>のようなセクション・マーキングは通常のテキストとして扱われます。この属性が有効であると、セクション・マーキングはそのように扱われます。

現在はマーク付のセクション要素に関連付けられたイベントはありません。

マークアップとテキストが理解されると、ハンドラが呼び出されます。以下のメソッドは異なるイベントのためにハンドラを設定するために使うことができます:

$p->handler( event => \&subroutine, argspec )
 
$p->handler( event => method_name, argspec )
 
$p->handler( event => \@accum, argspec )
 
$p->handler( event => "" );
 
$p->handler( event => undef );
 
$p->handler( event );
このメソッドはサブルーチン、メソッド、または配列をイベントを扱うために割り当てます。

eventはtext, start, end, declaration, comment, process または default. のどれか1つです。

Subroutine はイベントを扱うために呼ばれるサブルーチンへのリファレンスです。

Method_name はイベントを扱うために呼ばれる$pのメソッドの名前です。

Accum はsub-arraysとしてイベント情報を保持するための配列です。

2番目の引数が""であれば、イベントは無視されます。もしundefであれば、そのイベントのためにはdefaultハンドラが呼ばれます。

Argspec はそのイベントのために報告される情報を記述する文字列です。要求された情報のうちいずれかでもそのイベントに当てはまらなければ、undefとして渡されます。もしargspecが省略されると、最後の更新から変更されないままになります。

$p->handleからの戻り値は古いコールバック・ルーチンまたは蓄積する配列へのリファレンスです。

ハンドラ・コールバック・ルーチン/メソッドからの戻り値は常に無視されます。ハンドラ・コールバックは$p->eofメソッドを呼ぶことにより解析を中止するように要求することができます。ハンドラ・コールバックは$p->parse()または$p->parse_file()を呼び出すことが許されていません。

例:

    $p->handler(start =>  "start", 'self, attr, attrseq, text' );

これは'start'イベントのために呼び出されるオブジェクト$pの"start"メソッドを発生させます。コールバックの形式は$p->start(\%attr, \@attr_seq, $text).です。

    $p->handler(start =>  \&start, 'attr, attrseq, text' );

これは'start'イベントのためにサブルーチンstart()を呼び出させます。コールバックの形式はstart(\%attr, \@attr_seq, $text)です。

    $p->handler(start =>  \@accum, '"S", attr, attrseq, text' );

これは'start'イベント情報を@accumに保管させます。配列要素は['S', \%attr, \@attr_seq, $text].になります。

   $p->handler(start => "");

これは'start'イベントを無視させます。これはstartイベントのためのすべてのデフォルト・ハンドラの呼出しも抑止します。これは$p->handler(start => sub {})と同じですが、より効率的です。

   $p->handler(start => undef);

これはstartイベントに何もハンドラを関連付けません。もしデフォルト・ハンドラがあると、それが呼び出されます。


Argspec

Argspecはイベントにより報告される情報を記述するカンマ区切りのリストが入った文字列です。以下のargspec識別子名を使うことができます:

self
Selfは現在のオブジェクトをハンドラに渡させます。もしハンドラがメソッドであれば、これはargspecでの最初の要素でなければなりません。
tokens
Tokensはトークン文字列の配列へのリファレンスを渡させます。文字列は元のテキストで見つかったまさにそのままです。デコードや大文字・小文字の変更は適用されません。

declaration イベントでは、配列には各単語、コメント、そして宣言タイプで始まる区切られた文字列です。

comment イベントでは、これは各サブ・コメントが入ります。$p->strict_commentsが有効でなければ、1つのサブコメントだけが入ります。

start イベントでは、これには属性名/値の組が後ろについた元のタグ名が入ります。ブール値属性の値は$p->boolean_attribute_valueによって設定された値または、$p->boolean_attribute_valueによって値が設定されていなければ属性名になります。

end イベントでは、これには元のタグ名が入ります。(1トークンのみ)

process イベントでは、こにれは処理命令が入ります。(1トークンのみ)

これはtextイベントではundefを渡します。

tokenpos
Tokenpos は解析されたトークン位置の配列へのリファレンスを発生させます。各文字列はtokensで現れます。この配列には2つの数字がはいります。最初の数字は、トークンの開始の元のテキストでのオフセット、そして2番目の数字はトークンの長さです。

startイベントでのブール値属性は属性値のオフセットと長さは(0,0)になります。

これはもしイベントにトークンがなかったり(例えばtext)、空要素タグによりおこされる擬似的なend イベントのためにはundefを渡します。

これらのオフセットと長さをテキストを変更するために使うのであれば、右から左にやるかオフセットを変更するために非常に注意深く計算しなければなりません。

token0
Token0 は解析するための最初のトークン文字列の元のテキストを発生させます。これは常に$tokens->[0]と同じです。

declaration イベントでは、これは宣言タイプになります。

startend イベントでは、これはタグ名になります。

process とstrictでないcomment eventイベントでは、タグのなかのすべてになります。

もしイベントにトークンがなければundefを渡します。

tagname
これは開始、終了タグのための要素名です(もしくはSGML的には一般的な識別子(generic identifier))。HTMLでは大文字小文字を区別しないので、この名前は文字列マッチングしやすいように小文字にさせられます。

XMLでは大文字小文字を区別するので、xml_modeが有効であるとタグ名の大文字小文字は変更されません。

ちょっとおかしいかもしれませんが、declaration 要素の宣言タイプもタグ名として渡されます。事実、現在の実装ではタグ名は名前が小文字に供せさせられるかもしれないということを除いてはtoken0 と同じです。

attr
Attr は属性名/値の組のハッシュへのリファレンスを渡させます。

ブール属性の値は$p->boolean_attribute_valueによって設定された値または$p->boolean_attribute_valueによって何も値が設定されなければ属性です。

これはstartイベントを除いてはundefを渡します。

xml_modeが有効でなければ、属性名は小文字に強制されます。

属性値での一般的なエンティティはデコードされ、属性値の中に入っているマッチするクォートの1つのレイヤは削除されます。

attrseq
Attrseqは解析された属性名の配列へのリファレンスをおこします。これはもしattr ハッシュを元の順番で調べて見たいときに便利です。

これはstartイベントを除いてはundefを渡します。

xml_modeが有効でなければ、属性名は小文字に強制されます。

text
Text は元のテキストを(マークアップ要素区切り文字を含めて)渡させます。
dtext
Dtextは渡されるデコードされたテキストを発生します。イベントがCDATAセクションの内側であるかリテラル開始タグ、終了タグの間(script、style、xmpそしてplaintext)でなければ、一般的なエンティティは自動的にデコードされます。

エンティティデコードのためにはISO8859-1文字セット(いわゆるLatin1)が想定されます。

どこかの時点でHTML::Parserはutf8オプションをとることを予定しています。これは127よりも大きいコードをもつ文字をデコードするときにバイト並びに影響を与えます。

text イベントを除いてはundefを渡します。

is_cdata
Is_cdata はイベントがCDATAセクションの内側であるかリテラル開始タグ、終了タグの間(script、style、xmpそしてplaintext)であれば、TRUE値を発生させます。

textイベントでこのフラグがFALSEであれば、通常はさらにテキストを処理する前にdtext を使うか、エンティティを独自にデコードすることができます。

offset
Offsetは渡されたイベントのHTMLドキュメントでの開始からバイト位置を発生させます。ドキュメントの最初のバイトは0です。
length
Lengthは渡されたイベントの元のテキストのバイト数を発生させます。
event
Eventは渡されたイベント名を発生させます。

イベント名はtext, start, end, declaration, comment, process または default. のどれかです。

line
注意:これはまだサポートされていません!

Lineは渡されたイベントの開始の行番号を発生します。ドキュメントの最初の行は1です。行カウントはあるハンドラがこの値を要求するまでは開始しません。

'...'
0 から255文字のリテラル文字列をシングル(')またはダブル(")に囲んでいれることができます。
 
undef
未定義値を渡します。パディングとして便利です。

イベント

以下のイベントのためのハンドラを登録することができます:

text
単なるテキストが理解されたときに発火します。そのテキストには複数行はいっているかもしれません。$p->unbroken_textが有効でなければ、テキストの並びは複数のtextイベントで分割されてしまうかも知れません。

パーサーは2つのtextイベントの間の単語または空白の並びを分けないことを保証します。

start
このイベントは開始タグが理解されたときに発火します。

例:

  <A HREF="http://www.perl.com/";>
end
このイベントは終了タグが理解されたときに発火します。

例:

  </A>
declaration
このイベントはマークアップ宣言が理解されたときに発火します。

典型的なHTMLドキュメントでは、見つけることがありそうな宣言は<!DOCTYPE ...>です。

例:

  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
  "http://www.w3.org/TR/html40/strict.dtd";>

<!DOCTYPE ...>内のDTDはHTML::Parserを混乱させます。

comment
このイベントはマークアップ・コメントが理解されたときに発火します。

例:

  <!-- This is a comment -- -- So is this -->
process
このイベントは処理命令マークアップが理解されたときに発火します。

処理命令のフォーマットと内容はシステムとアプリケーションに依存します。

例:

  <? HTML processing instructions >
  <? XML processing instructions ?>
default
このイベントは特定のハンドラを持たないイベントのために発火します。明示的にとりたくないもの捕らえるために、このイベントのためのハンドラを設定することができます。

バージョン2との互換性

引数なしでHTML::Parserオブジェクトが構築されると、古いHTML::Parserバージョン2コールバック・メソッドと互換性のある、いくつかのハンドラが自動的に提供されます。

これは以下のメソッド呼出しと同等です:

   $p->handler(start   => "start",   "self, tagname, attr, attrseq, text");
   $p->handler(end     => "end",     "self, tagname, text");
   $p->handler(text    => "text",    "self, text, is_cdata");
   $p->handler(process => "process", "self, token0, text");
   $p->handler(comment =>
             sub {
                 my($self, $tokens) = @_;
                 for (@$tokens) {$self->comment($_);}},
             "self, tokens");
   $p->handler(declaration =>
             sub {
                 my $self = shift;
                 $self->declaration(substr($_[0], 2, -1));},
             "self, text");

これらのハンドラの設定は"api_version => 2"コンストラクタ・オプションで要求することもできます。


サブクラス化

HTML::Parserクラスはサブクラスを作成することができます。Parserオブジェクトは単なるハッシュで、HTML::Parserは"_hparser"から始まるハッシュキーを予約しているだけに過ぎません。パーサーの状態はnew()と同じ引数を取るinit()メソッドを呼び出すことにより設定することができます。


最初の簡単な例はどのうようにしてHTMLドキュメントからコメントをはずすことができるかを示します。commentハンドラで何もせず、defaultハンドラではそれ以外を出力するようにして実現します:

  use HTML::Parser;
  HTML::Parser->new(default_h => [sub { print shift }, 'text'],
                    comment_h => [""],
                   )->parse_file(shift || die) || die $!;

次の簡単な例はHTMLドキュメントの<title>要素の内側のテキストを出力します。ここではstartハンドラを設定することから始めます。title開始タグを見つけたら、それは見つかったすべてのテキストを出力するtextハンドラと見つかったtitle終了タグが見つかるとすぐに終らせるendハンドラを有効とします:

  use HTML::Parser ();
  sub start_handler
  {
    return if shift ne "title";
    my $self = shift;
    $self->handler(text => sub { print shift }, "dtext");
    $self->handler(end  => sub { shift->eof if shift eq "title"; },
                           "tagname,self");
  }
  my $p = HTML::Parser->new(api_version => 3);
  $p->handler( start => \&start_handler, "tagname,self");
  $p->parse_file(shift || die) || die $!;
  print "\n";

さらなる例がHTML-Parserディストリビューションの"eg/"に入っています;プログラムhrefsubはドキュメントで見つかったすべてのリンクの編集の方法を示します。またhtextsubはテキストだけを編集する方法を示します;プログラムhstripはあるタグ/要素 そして/または属性をどのように取り除くかを示します;そしてプログラムhtextはscript/styleの内容を除いた、プレーン・テキストをどのように取得するかを示します。


バグ

HTML::Parserは</plaintext>を見つけても<plaintext>モードのままです。Plaintextモードは本当にエスケープ可能であるきるべきではありません。

<style>と<script>セクションは最初の"</"で終りません。しかし完全に対応する終了タグが必要です。

strict_comment が有効なとき、まだ偶数あるいは奇数の"--"マーカーの間の空白でないものもコメントとして理解してしまいます。

一度$p->boolean_attribute_value が設定されると、デフォルトの動きに戻す方法がありません。

今のところ、両方のクォート文字を同じリテラル argspecに入れる方法がありません。

空タグ、例えば"<>"と"</>"は理解されません。SGMLは前の開始タグあるいは対応する前の開始タグを閉じるために繰り返すことを許しています。

NETタグ、例えば"code/.../"は理解されません。これは"<code>...</code>"のためのSGML省略形です。

閉じられていない開始または終了タグ、例えば"<tt<b>...</b</tt>"は理解されません。


診断メッセージ

以下のメッセージがHTML::Parserにより作成されます。このリストでの書き方はperldiagでのものと同じです。

Not a reference to a hash
(F) ブレスされたもしくはHTML::Parserからサブクラス化されたオブジェクトがHTML::Parserメソッドによって必要とされるハッシュではない
Bad signature in parser state object at %p
(F) _hparser_xs_state 要素は正しいstate構造を参照していない。何かがこのハッシュ要素に格納された内部の値を変更したか、あるいはメモリが上書きされました。
_hparser_xs_state element is not a reference
(F) _hparser_xs_state 要素が破壊された
Can't find '_hparser_xs_state' element in HTML::Parser hash
(F) _hparser_xs_state 要素がparserハッシュから見つかりません。それは削除されたか、オブジェクトが生成されたときに作られませんでした。
API version %s not supported by HTML::Parser %s
(F) コンストラクタ・オプション 'api_version' への4以上の値は将来の拡張のために予約されています。
Bad constructor option '%s'
(F) new()またはinit()メソッドにわからないコンストラクタ・オプションキーが渡されました。
Parse loop not allowed
(F) ハンドラがparse()またはparse_file()メソッドを呼出しました。これは許されません。
marked sections not supported
(F) $p->marked_sections() メソッドがマーク付セクションのサポートなしでコンパイルされたHTML::Parserモジュールの中で呼び出されました。
Unknown boolean attribute (%d)
(F) ブール値属性の別名を設定する内部ロジックで何かおかしくなっています。
Only code or array references allowed as handler
(F) $p->handlerへの2番目の引数はサブルーチン・リファレンス、サブルーチンもしくはメソッドの名前または配列へのリファレンスでなければなりません。
No handler for %s events
(F) $p->handlerへの最初の引数は正しいイベント名でなければなりません:つまり"start", "end", "text", "process", "declaration" ,"comment" のどれかです。
Unrecognized identifier %s in argspec
(F) その識別子はわかっているargspec名ではありません。上記のargspecセクションで説明されている名前の1つを使ってください。
Literal string is longer than 255 chars in argspec
(F) この実装はargspecでのリテラルの長さを255文字に制限しています。リテラルを短くしてください。
Backslash reserved for literal string in argspec
(F) バックスラッシュ文字"\"はargspecリテラルとして許されません。これは後のバージョンでのリテラルのクォートを可能にするために予約されています。
Unterminated literal string in argspec
(F) リテラルのための終りのクォートが見つかりません。
Bad argspec (%s)
(F) 識別子名、リテラル、空白そしてカンマだけがargspecでは許されています。
Missing comma separator in argspec
(F) argspecでの識別子名は","で区切られなければなりません。

参考資料

HTML::Entities, HTML::TokeParser, HTML::HeadParser, HTML::LinkExtor, HTML::Form

HTML::TreeBuilder ( HTML-Tree ディストリビューションの一部)

http://www.w3.org/TR/REC-html40

マークがついたセクションと処理命令についてのさらなる情報はhttp://www.sgml.u-net.com/book/sgml-8.htm. にあるでしょう。


著作権(COPYRIGHT)

(原文のまま)

 Copyright 1996-2000 Gisle Aas. All rights reserved.
 Copyright 1999-2000 Michael A. Chase.  All rights reserved.

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


ホーム Perlの小技

ご意見、ご質問はこちらの掲示板で受け付けています。
またメールは河馬屋(Nifty)にお願いします。