2009-07-22 4 views
0

내가 포함하는 구조체가 있습니다 :Perl에서 여러 변수를 어떻게 풀 수 있습니까?

struct mystruct{ 
    int    id[10]; 
    char    text[40]; 
    unsigned short int len; 
}; 

그리고 한 줄로,이 같은 압축 풀기 위해 노력하고있어 :

 my(@ids,$text,$length) = unpack("N10C40n",$buff) ; 

하지만 모든 배열 (@ids), "N10 C40 n"및 "(N10)(C40)(n)" 템플릿을 시도했습니다. 따라서이 중 하나를 수행 할 수 없거나 적절한 템플릿 문자열을 사용하고 있지 않습니다.

참고 : 빅 엔디안 데이터를 사용하고 있습니다.

힌트가 있습니까?

답변

7

목록 할당에서 첫 번째 배열 또는 해시는 모든 것을 먹습니다 (중지 할 위치를 어떻게 알 수 있습니까?). 대신을 시도해보십시오 @ids의 순서는 중요하지 않습니다 경우

my @unpacked  = unpack "N10Z40n", $buff; 
my @ids    = @unpacked[0 .. 9]; 
my ($text, $length) = @unpacked[10, 11]; 

당신은 또한

my @ids; 
(@ids[0 .. 9], my ($text, $length)) = unpack "N10Z40n", $buff; 
+1

을 나는 $ 텍스트에 C40을받을 수없는 경우, 그 대신에 나는 $ C로 $ C와 $ C 길이의 첫 C를 얻고있다. –

+0

흠, 나는 당신의 포장이 정확하다고 생각했었다. –

+1

아마도'C40' 대신'A40'을 원할 것입니다. 'A40'은 40 자의 공백으로 채워진 문자열이고'C40 '은 40 개의 개별 옥텟입니다. 'text '가 C 스타일 문자열 (즉, 문자의 널 종료 시퀀스)이라는 생각에 부합하는'Z40 '을 원할 수도 있습니다. –

1

을 말할 수있다 : 그와

my ($length, $text, @ids) = reverse unpack("N10C40n",$buff) ; 
+0

흥미로운 아이디어, 나는 그것을 고려하지 않았다. –

+0

@Chas. 그것은 속도면에서 당신의 솔루션보다 열등하지만'unpack '에 의해 반환 된 목록이 충분히 작 으면 더 간단 할 것입니다. –

관련 문제