8-2.処理 3-2.見出し出力 後編

さて、ループ内の処理ですが、最初は


 #大見出しかチェック(正規表現で判定)

 if($sctnArr[$sctnCnt] -match $bSctRgx){

  #大見出しの出力実行(正規表現で不要部分を置換)

  Write-Output ($bSct+($sctnArr[$sctnCnt] -replace $rpRgx)) | Add-content -Path $otptPth -Encoding utf8

  #目次配列のカウンタ+1

  $sctnCnt=$sctnCnt+1

  continue

 }


というif文から。

if文の条件は


 $sctnArr[$sctnCnt] -match $bSctRgx


「$sctnArr[$sctnCnt]」は今処理中の目次配列のタイトルで、「-match」は「文字列 -match 正規表現」で、「文字列が正規表現と一致したら」という条件になります。

$bSctRgxは最初の変数格納でやった通りで、中身は「^§ 」、「行頭に(^)§がある」という正規表現です。


そして条件に合致した場合の処理。


  #大見出しの出力実行(正規表現で不要部分を置換)

  Write-Output ($bSct+($sctnArr[$sctnCnt] -replace $rpRgx)) | Add-content -Path $otptPth -Encoding utf8


戻り値がないタイプのパイプ(|)処理~。

なので、「Write-Output」の結果で「Add-content」の処理が実行されるわけです。

というわけで、「Write-Output」の方の解説から。


Write-Output ($bSct+($sctnArr[$sctnCnt] -replace $rpRgx))


「Write-Output」は通常「出力する」です。基本的には画面上に変数等の内容を表示する。

その後ろは文字列連結と置換の合わせ技ですね。

「$sctnArr[$sctnCnt] -replace $rpRgx」はwhile文の条件でも使ってる、目次配列にそのまま入ってるabout.txtの目次の不要部分の置換処理(§とか)。

$bSctは変数格納で書いてあった通り、大見出し用の見出しですね、デフォルトは「大見出し:」。

なので、デフォルトだと「大見出し:大見出しタイトル」という文字列を「Write-Output」するというわけです。


その後の処理が「Add-content」、「指定したファイル末尾に追記する」処理です。


Add-content -Path $otptPth -Encoding utf8


$otptPthはやっぱり変数格納で格納している出力ファイルのフルパスです。

「-Path」はその後ろの変数を「Add-content」が追記する対象のファイルパスの指定になります。

「-Encoding」は文字コード指定、目次配列の取得がUTF8だったので、当然出力も合わせるわけです。

「Add-content」で出力ファイルに追記する内容は、Write-Outputした内容です。

なのでこれで「大見出し:大見出しタイトル」という1行が出力ファイルに追記されるわけです。


その後は


  #目次配列のカウンタ+1

  $sctnCnt=$sctnCnt+1


コメントの通り、目次配列のカウンタを増やします。これで、この次に「$sctnArr[$sctnCnt] 」を行う時には、今見ていた部屋の次の部屋を見る事ができるわけです。

その後の「continue」は現在のループ内の処理をその時点で止め、ループ処理の頭に移動します。

つまり、その時点で次の周回に飛ばす処理です。

その後が小見出しの処理になるので、大見出しだったらその時点で次の周回に行けばいいわけです。

もし、そこで小見出しがなくても、処理冒頭に跳ぶことで、ループ条件をもう一回チェックするので、見出しじゃなくてエピソードになってたら自動的にループが終わるのです。


さて、次が小見出しの時の処理ですね。


 #小見出しかチェック(正規表現で判定)

 if($sctnArr[$sctnCnt] -match $sSctRgx){

  #小見出しの出力実行(正規表現で不要部分を置換)

  Write-Output ($sSct+($sctnArr[$sctnCnt] -replace $rpRgx)) | Add-content -Path $otptPth -Encoding utf8

  #目次配列のカウンタ+1

  $sctnCnt=$sctnCnt+1

  continue

 }


正直、変数が変わってるだけでやってることは大見出しとまるっきり一緒なので省略します。

「§」が「 §」、「大見出し:」が「小見出し:」になるだけだからね。

さて、ループ終了後、このループの外側のif文の最後にある処理は


  #目次配列のカウンタ+1

  $sctnCnt=$sctnCnt+1


となります。

というのも、これ以降foreachのループが次の周回に行くまでは、目次配列は参照する必要がないので、この時点でカウンタを1つ進めておくことで、次のforeach冒頭の処理が問題なく行われるわけです。




  • Xで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る