昔の掲示板を設置するMojolicousからCGIを呼ぶ他者のPerlを書き替える他者のPerlを書き替える~2~全ページに告知コンテキストによるreverseとファイルハンドルの挙動2018-11-14こんなツイートを見かけて興味かけたperlソースだけれど、実行マシンによってスカラーコンテキストになるか配列コンテキストになるか変わるらしい。再現に挑戦コードはこちら。FH;再現に失敗オプション「-cw」を追加してチェックすると実行できない事が分かりました。255再挑戦whileをforにするとチェックが通ります。FH;入力ファイルと実行結果ファイルハンドルをリストコンテキストで評価、全部の行を読み込んで1行1要素のリストを返し、reverseが逆順にしてforループに渡しました。簡単に言うとファイルの行を逆順にしています。入力ファイルsample_51.txtの内容(utf8)本日は晴天なり。明日も良い天気になると良いなあ。これ↑がこう↓なります(結果を引用符で囲んで、改行位置をチェック)。''明日も良い天気になると良いなあ。'途中経過の予想ループの基準になるリストがどういう風に生成されるのか予想してみました。"'$line'";}reverseのパラメタはリストコンテキスト。リストコンテキストでのファイルハンドルは1行1要素のリストを返します。"明日も良い天気になると良いなあ。"'$line'";}forのリストなのでリストコンテキスト(そりゃそうだ)ですから、reverseはリストの要素を逆順にしたリストを返します。("ここが3行目です。"明日も良い天気になると良いなあ。"'$line'";}ループ内の処理をします。説明用にchompにリテラルを書きましたけれど、リテラルを書き換えできない(左辺値でない)のでエラーになります。"明日も良い天気になると良いなあ。"'$line'";chompが末尾の改行コードを削除します。"'ここが3行目です。"'明日も良い天気になると良いなあ。'";はい、できあがり(ホントかなあ)。''明日も良い天気になると良いなあ。'reverseやファイルハンドルの挙動を確認reverseとファイルハンドル(を山括弧で囲んだIO演算子)は、それぞれリストコンテキストとスカラコンテキストで挙動が異なります。全ての文字を逆順にした文字列を返します。行の入力行すべてからなるリストが返されます。perldoc.jp確認してみましょう。再現できず仕様通りの結果になってしまいました。ループで逆順に読む'ここが3行目です。''明日も良い天気になると良いなあ。'ファイルハンドルをリストコンテキストで呼ぶと「本日は晴天なり。明日も良い天気になると良いなあ。」が返るファイルハンドルをスカラコンテキストで呼ぶと「本日は晴天なり。あ」が返るスカラコンテキストでfunc_fを呼ぶ→func_fはスカラコンテキストで呼ばれましたリストコンテキストでfunc_fを呼ぶ→func_fはリストコンテキストで呼ばれましたスカラコンテキストでreverseを呼ぶ際の引数にfunc_f→func_fはリストコンテキストで呼ばれましたリストコンテキストでreverseを呼ぶ際の引数にfunc_f→func_fはリストコンテキストで呼ばれましたforループのリストにreverseとfunc_f→func_fはリストコンテキストで呼ばれました'俺の嫁''は''たこルカ'まとめとりあえず仕様通りに動作していて、再現できませんでした(泣)。mojolicious。