배열처럼 보이는 일반변수만 존재할 뿐이다.
%itemArray[0], %itemArray[1], %itemArray[2].... 는
사실 상 %itemArray0, %itemArray1, %itemArray2 와 같다.
마찬가지로 이중배열도 %itemArray[0, 0], %itemArray[0, 1] 은
%itemArray0_0, %itemArray0_1 과 같다. (꺽쇠는 제거되고 콤마는 언더바로 바뀐다)
저렇게 쓰는 것이 편할 때도 가끔 있지만,
진정한(?) 배열이 존재하지 않는다는 것이 불편할 때가 더 많다.
배열이 실제로는 같은 prefix 를 가지며 연속된 번호로 연결된
일반변수이므로 배열자체를 리턴할 수가 없기 때문이다.
그래서...
배열을 다루듯이 어떤 오브젝트를 점(.) 으로 접근해서 사용하고 싶다면
이렇게 사용하는 방법이 있다.
%array = new ScriptObject(itemArray);
%array.count = getRecordCount(%linestring);
for ( %i=0; %i < %array.count; %i++ )
{
%string = getRecord(%linestring, %i);
%array.val1[%i] = getField(%string, 0);
%array.val2[%i] = getField(%string, 1);
%array.val3[%i] = getField(%string, 2);
%array.val4[%i] = getField(%string, 3);
%array.val5[%i] = getField(%string, 4);
%array.val6[%i] = getField(%string, 5);
}
itemArray 라는 스크립트 오브젝트를 만들었다.
%linestring 은 개행(\n 또는 NL)으로 구분된 레코드들의 묶음이며,
각 레코드들은 탭(\t 또는 TAB)으로 구분되어있다.
getField는 하나의 레코드에서 TAB으로 구분된 필드들을 가져오는 함수이다.
저렇게 만든 itemArray 오브젝트를 실제로 사용할 때 는
itemArray.val1[%i]
itemArray.val2[%i]
로 접근해서 사용할 수 있다.
이렇게 함으로써 배열을 리턴할 필요가 없어졌고 어디서든 itemArray 로 접근해서 필드 값을 가져올수있다.
다만, 어디서든 접근할 수 있는 마치 전역변수 같은 오브젝트이므로 단발적으로 필요한 것이라면 쓰고나서
itemArray.delete(); 로 지워주면 더 좋겠다.
그것이 싫다면
function x()
{
%ret = new ScriptObject();
%ret.val[1] = 2;
%ret.val[2] = 1;
return %ret;
}
$ret = x();
echo($ret.val[1]);
$ret.delete();
이런 방식으로도 사용할 수있다.