これは、Ubuntu Online、Fedora Online、Windows オンライン エミュレーター、MAC OS オンライン エミュレーターなどの複数の無料オンライン ワークステーションの XNUMX つを使用して、OnWorks 無料ホスティング プロバイダーで実行できるコマンド perlhacktut です。
プログラム:
NAME
perlhacktut - 単純な C コード パッチの作成手順を説明します。
DESCRIPTION
このドキュメントでは、簡単なパッチの例を説明します。
perlhack をまだ読んでいない場合は、まず読んでください。 こちらも読んでみてはいかがでしょうか
パールソースも。
ここでの作業が完了したら、次に perlhacktips を確認してください。
実施例 OF A SIMPLE PATCH
最初から最後まで簡単なパッチを適用してみましょう。
Larry が提案したのは次のとおりです。「パック」中に「U」が最初のアクティブなフォーマットである場合、
(例: "pack "U3C8", @stuff") 結果の文字列は UTF-8 として扱われます。
エンコードされます。
Perl リポジトリの git clone を使用している場合は、
変更のためにブランチを作成します。 これにより、適切なパッチの作成がはるかに簡単になります。 を参照してください。
これを行う方法の詳細については、perlgit を参照してください。
書き込み patch
この問題を解決するにはどのように準備すればよいでしょうか? まず、問題のコード、つまり「パック」を見つけます。
実行時に発生するため、次のいずれかになります。 pp ファイル。 案の定、「pp_pack」は
in pp.c。 このファイルを変更するので、次の場所にコピーしましょう。 pp.c~.
[まあ、入ってましたよ pp.c このチュートリアルが書かれたとき。 現在は分離されています
「pp_unpack」を独自のファイルに、 pp_pack.c]
次に、「pp_pack」を見てみましょう。パターンを「pat」に取り込み、それからループします。
パターン、各フォーマット文字を順番に「datum_type」に取り込みます。 次に、可能なそれぞれについて
フォーマット文字を使用すると、パターン内の他の引数 (フィールド幅、
アスタリスクなど)、次のチャンク入力を指定された形式に変換して追加します。
出力SV「cat」に追加します。
「U」が「pat」の最初の形式であるかどうかをどのように確認すればよいでしょうか? さて、もしポインタがあるとすれば、
「pat」の始まりです。「U」が表示されたら、まだ最初の段階にいるかどうかをテストできます。
文字列。 したがって、「pat」が設定されている場所は次のとおりです。
STRLEN フロムレン;
char *pat = SvPVx(*++MARK, fromlen);
char *patend = pat + fromlen;
I32 レン;
I32 データタイプ;
SV *fromstr;
そこに別の文字列ポインターがあります。
STRLEN フロムレン;
char *pat = SvPVx(*++MARK, fromlen);
char *patend = pat + fromlen;
+ char *patcopy;
I32 レン;
I32 データタイプ;
SV *fromstr;
そして、ループを開始する直前に、「patcopy」を「pat」の先頭に設定します。
アイテム = SP - マーク;
マーク++;
sv_setpvn(cat, "", 0);
+ パットコピー = パット;
while (パット < パット) {
ここで、文字列の先頭に「U」がある場合、その文字列の「UTF8」フラグをオンにします。
出力SV、「cat」:
+ if (データタイプ == 'U' && pat==patcopy+1)
+ SvUTF8_on(猫);
if (データタイプ == '#') {
while (pat < patend && *pat != '\n')
パット++;
文字列の最初の文字は「patcopy+1」である必要があることに注意してください。
「datumtype」に飲み込まれた「U」!
おっと、一つ忘れていました。パターンの先頭にスペースがある場合はどうなるでしょうか? "パック("
U*", @stuff)" は、最初ではない場合でも、最初のアクティブな文字として「U」を持ちます。
模様の中のもの。 この場合、「pat」と同時に「patcopy」も進める必要があります。
スペースを参照:
if (isSPACE(データタイプ))
続ける;
になる必要がある
if (isSPACE(データタイプ)) {
パットコピー++;
続ける;
}
OK。 これでC部分は完了です。 このパッチを適用する前に、さらに XNUMX つのことを行う必要があります。
準備完了: Perl の動作を変更したので、その変更を文書化する必要があります。 私たち
パッチが機能するかどうかを確認するために、さらにいくつかの回帰テストも提供する必要があります。
どこか別の場所にバグを作成します。
テスト patch
各演算子の回帰テストは次の場所にあります。 上/ので、コピーを作成します t/op/pack.t
〜へ t/op/pack.t~。 これで、最後にテストを追加できます。 まず、「U」が行うかどうかをテストします。
実際に Unicode 文字列を作成します。
t/op/pack.t には賢明な機能があります Ok() 関数ですが、そうでない場合は、からの関数を使用できます
t/test.pl。
'./test.pl' が必要です。
plan( テスト => 159 );
したがって、これの代わりに:
"1.20.300.4000" eq sprintf "%vd" でない限り、 print 'not '、
パック("U*",1,20,300,4000);
"ok $test\n" を出力します。 $test++;
もっと賢明な方法を書くことができます (完全な説明については、Test::More を参照してください) は() およびその他の
テスト機能)。
is( "1.20.300.4000", sprintf "%vd", Pack("U*",1,20,300,4000),
"U* は Unicode を生成します" );
ここで、ビジネスの開始時のスペースが正しく得られたかどうかをテストします。
is( "1.20.300.4000", sprintf "%vd", Pack(" U*",1,20,300,4000),
" 先頭にスペースを入れます" );
最後に、「U」が次の場合に Unicode 文字列を作成しないことをテストします。 最初のアクティブな
フォーマット:
isnt( v1.20.300.4000, sprintf "%vd", Pack("C0U*",1,20,300,4000),
"最初でない U* は Unicode ではありません" );
上部に表示されるテストの数を変更することを忘れないでください。
自動テスターは混乱するでしょう。 これは次のようになります。
"1..156\n" を出力します。
またはこれ:
plan( テスト => 156 );
次に、Perl をコンパイルし、テスト スイートで実行します。 新しいテストは合格しました、万歳!
文書化 patch
最後にドキュメントです。 書類手続きが終わるまで仕事は終わりません。
行ったばかりの変更について説明します。 該当する場所は、 ポッド/perlfunc.pod; もう一度、私たちは
コピーを作成し、次のテキストを「パック」の説明に挿入します。
=項目*
パターンが C で始まる場合、結果の文字列が処理されます
UTF-8 でエンコードされた Unicode として。 文字列内で UTF-8 エンコーディングを強制できます
イニシャルCが付いた、それに続くバイトは次のように解釈されます。
ユニコード文字。 これが起きたくない場合は、始めてください
Cを使ったあなたのパターン(またはその他) Perl を UTF-0 にしないように強制します。
文字列をエンコードし、その後に C を続けます。 あなたの中のどこかに
パターン。
送信する
このパッチの送信方法の詳細については、perlhack を参照してください。
onworks.net サービスを使用してオンラインで perlhacktut を使用する