awkでは、関数定義はいつ実行されますか?
関数定義は実行前に実行されますかBEGIN {...}
?ありがとうございます。
ベストアンサー1
これは決まりやすかった。私はawkスクリプトファイルの最後に関数を定義して、「最悪の場合」を最初にテストすることにしました。
$ cat go.awk
BEGIN {
print "The BEGIN block is executing"
print reverse("The BEGIN block is executing")
}
{
print reverse($0)
}
function reverse(str) {
trs=""
for(i=length(str); i > 0; i--) {
trs=trs substr(str, i, 1);
}
return trs
}
そして:
$ cat input
line one
line two
line three
...結果は次のとおりです。
$ awk -f go.awk < input
The BEGIN block is executing
gnitucexe si kcolb NIGEB ehT
eno enil
owt enil
eerht enil
BEGINブロックがユーザー定義reverse
関数を正常に呼び出したため、BEGINブロックが入力される前(「定義済み」関数が「実行」される)関数が定義されていることがわかります。
この機能を見ましたか?処刑された定義したら、print
関数の中に文を挿入し、関数が定義されるまで文に出力がないことを確認してください。と言う。
これawkのPOSIX仕様最も関連性の高いものは次のとおりです。
関数はawkプログラムのどこでも参照でき、特に関数定義の前に使用できます。関数の範囲はグローバルです。
これ愚かなマンページ次のことを暗示します。
... Gawkは、すべてのプログラムファイルとコマンドラインソーステキストが一緒にリンクされているかのようにプログラムテキストを読み込みます。これは、それを使用するすべての新しいAWKプログラムに関数を含めることなくAWK関数ライブラリを構築するのに役立ちます。ライブラリ機能をコマンドラインプログラムと混在させる機能も提供します。
...
Gawkは次の順序でAWKプログラムを実行します。まず、-vオプションで指定されたすべての変数割り当てが実行されます。次に、gawk はプログラムを内部形式にコンパイルします。その後、gawkはBEGINルール(存在する場合)のコードを実行して続行します。