jq에서 함수 정의 및 맵 사용

jq에서 함수 정의 및 맵 사용

다음 두 가지가 어떻게 다른지 설명해 주실 수 있나요?

jq ´def addvalue(f): . + [f]; map(addvalue(.[0]))´

[[1,2],[10,20]]
=> [[1,2,1], [10,20,10]]

jq ´def addvalue(f): f as $x | map(. + $x); addvalue(.[0])´
[[1,2],[10,20]]
=> [[1,2,1,2], [10,20,1,2]]

감사해요.

답변1

요약: 두 함수와 이를 호출하는 방법은 map()작업이 수행되는 위치와 추가에 사용되는 내용이 다릅니다. 이는 첫 번째 경우처럼 중요합니다. map()호출에서는 함수의 추가가 다음 요소의 첫 번째 요소를 사용하도록 합니다.각 개별 하위 배열입력 배열의 두 번째 경우에는 map()함수 내부에서 수행되며 추가는 다음을 사용합니다.전체 첫 번째 하위 배열입력 배열의


첫 번째 함수에서는

def addvalue(f): . + [f];

[f]입력 스트림에서 배열로 간주되는 항목에 배열을 추가합니다 . 다른 배열에 배열을 추가하면 해당 배열에 새 요소가 추가되는 효과가 있습니다.

;를 사용하여 이 addvalue()함수를 두 번 호출합니다 map(). 각 배열에 대해 한 번 [1,2][10,20]. 첫 번째 호출에서 [f]will은 [1]이므로 1첫 번째 배열에 새 요소를 추가하여 를 생성합니다 [1,2,1]. 마찬가지로 is 일 [10,20,10]때 두 번째 호출에서 가져옵니다 .[f][10]

함수에 디버깅을 추가하면,

def addvalue(f): debug | . + [f]

질문에서와 같이 호출하면 다음과 같은 결과를 얻습니다.

["DEBUG:",[1,2]]
["DEBUG:",[10,20]]

이는 함수가 두 번 호출되었음을 보여줍니다. 값은 첫 번째 호출에 있어서 가 되고 두 번째 호출에서는 가 [f]됩니다 . 호출 작업은 이러한 배열 을 .[1][1,2] + [1][1,2,1][10][10,20] + [10][10,20,10]map()[[1,2,1],[10,20,10]]


기능에서

def addvalue(f): f as $x | map(. + $x);

map()입력 스트림에서 배열로 간주되는 것을 호출합니다 . 입력 배열의 각 요소에 대해 $x해당 요소에 추가합니다. 값은 $x배열의 첫 번째 요소입니다.

배열을 [[1,2],[10,20]]입력 배열로 사용하고 [1,2]인수로 사용하여 이 함수를 한 번 호출합니다. 입력 배열의 각 요소에 대해(즉, [1,2]및 의 경우) ( 배열의 첫 번째 요소인 의 값 )을 [10,20]추가합니다 . 다른 배열에 배열을 추가하면 배열의 요소가 서로 추가되는 효과가 있으므로 결국 결과 배열의 두 요소는 및 가 됩니다.[1,2]$x[1,2,1,2][10,20,1,2]

첫 번째와 비슷한 방식으로 두 번째 함수에서 디버깅을 활성화합니다.

def addvalue(f): debug | f as $x | map(. + $x);

우리는 출력으로 얻습니다

["DEBUG:",[[1,2],[10,20]]]

이는 함수가 한 번 호출되었음을 나타냅니다. 이 map()작업은 입력 배열의 각 요소가 [1,2]자체에 추가 되어 [[1,2,1,2],[10,20,1,2]]결과를 제공하는 배열을 생성합니다.


첫 번째 함수가 두 번째 함수처럼 작동하도록 하려면 다음을 사용하여 호출해야 합니다.

.[0] as $x | map(addvalue($x[]))

두 번째 함수가 첫 번째 함수처럼 작동하도록 하려면 다음과 같이 호출해야 합니다.

[ .[] as $x | [$x] | addvalue([$x[0]]) | add ]

관련 정보