awk 함수 매개변수

awk 함수 매개변수

gawk 함수 매개변수의 사용법을 이해할 수 없습니다. 일반적으로 매개변수는 함수의 지역 변수를 정의합니다.

하지만 매개변수를 함수가 사용할 수 있는 입력으로 사용할 수 있습니까?

사용법을 본 후 return실제로 호출하여 값을 반환합니다.

val=myfunc()

전역 변수에 계속 액세스할 수 있는 경우 전역 값을 입력 매개변수로 함수에 전달하면 어떤 이점이 있나요?

답변1

귀하의 질문은 잘못된 전제에 기초하고 있습니다.

일반적으로 매개변수는 함수의 지역 변수를 정의합니다.

습관. 일반적으로 인수는 함수에 전달되는 값에 대한 변수 이름을 정의합니다.

awk지역적으로 범위가 지정된 변수를 선언하는 기능은 없습니다. 그러나 모든 함수 매개 변수는 선택 사항이므로 함수 내에서 로컬로 사용되는 것 외에 다른 목적이 없는 변수로 함수 매개 변수 목록을 오버로드하는 것은 허용되는 관행으로 간주됩니다.

따라서 귀하의 질문에 대한 대답은 "예"입니다. 변수를 사용하여 값을 함수에 전달할 수 있습니다.

예를 들어,

awk '
    function factorial(n) { return n>1 ? n*factorial(n-1) : 1 }
    BEGIN { print factorial(5) }
'

여기서 함수는 매번 다른 값(처음 5개, 그 다음에는 값 4, 3, 2 감소)으로 자신을 호출합니다. 이를 위해 전역 변수를 사용하는 것은 매우 어려울 것입니다.

답변2

또한 함수에 대한 스칼라 인수는 값으로 전달되지만 배열 인수는 참조로 전달됩니다. 따라서 함수는 호출 코드에 선언된 배열 값을 함수로 변경하여 여러 값을 반환할 수 있습니다.

여기에는 처음에 빈 배열로 전달된 경우에도 배열 매개변수에 새 요소를 생성하는 기능이 포함됩니다.

두 개의 숫자를 받아들이는 함수를 원하고 두 개의 변수 값(하나는 합계를 포함하고 다른 하나는 평균을 포함)을 출력하고 싶다고 가정해 보겠습니다. 무엇을 할 수 있나요?

이렇게 할 수 있습니다. 동일한 이름의 배열에 대해 전역 및 로컬 범위가 있고 길이가 다를 수 있고 데이터가 다를 수 있으며 배열이 참조로 전달되고 여러 값을 반환할 수 있음을 증명합니다.

#! /bin/bash

Awk='
#.. Define and fill an array X at global scope.
BEGIN { X[1] = 45; X[2] = 98; }
#.. Function that fills in a result array (passed by reference).
function Math (X, v1, v2) {
    X[1] = v1 + v2; X[2] = (v1 + v2) / 2; X[3] = v1 * v2;
}
#.. Function that declares an array X at local scope, and reports it.
function Wrapper (a, b,      X, j) {
    Math( X, a, b);
    for (j = 1; j in X; ++j) printf ("Local X[%d] is %f\n", j, X[j]);
}
{ 
    Wrapper( $1, $2);
    #.. Prove that the Global X is unaffected, in length or content.
    for (j = 1; j in X; ++j) printf ("Global X[%d] is %f\n", j, X[j]);
}
'   
    echo 3.5 2.7 | awk "${Awk}"
$ ./Heime.awk
Local X[1] is 6.200000
Local X[2] is 3.100000
Local X[3] is 9.450000
Global X[1] is 45.000000
Global X[2] is 98.000000 

GNU Awk는 잘 작동합니다. X에 처음 액세스할 때 X의 유형을 결정합니다. nawk(Solaris Awk) 이 결정은 전달될 때 내려지는 것 같습니다(그리고 SegViol을 유발할 수 있음).

X가 참조로 함수에 전달 되도록 하려면 nawkX를 전달하기 전에 길이가 0인 패턴을 사용하여 길이가 0인 문자열을 분할하여 명시적으로 길이가 0인 배열로 만들어야 할 수도 있습니다.

    split ("", X, ""); Math( X, a, b);

답변3

전역 변수에 계속 액세스할 수 있는 경우 전역 값을 입력 매개변수로 함수에 전달하면 어떤 이점이 있나요?

모든 프로그래밍 언어의 모든 함수와 동일합니다. 매번 다른 (전역) 변수를 전달할 수 있으며 함수는 작업을 수행하는 데 필요하지 않은 어떤 것도 알 필요가 없습니다.

간단한 예를 들어보세요:

function sum(a,b) { return a+b; }

{ partial = sum($2, $3); }
$1 == 0 { print sum(partial, $4); }
$1 != 0 { print sum(partial, $5); }

대신 더 복잡한 함수를 상상해 보세요 sum(). 그러면 두 분기 모두에서 함수를 복제하는 것이 더 이상 의미가 없습니다.

관련 정보