2011-11-30 3 views
2

의 길이 : 첫 번째 length($a)가 올 수 있도록펄 팩 /이 짧은 예제를 생각해 풀고 바이너리 문자열

$a = pack("d",255); 
print length($a)."\n"; 
# Prints 8 

$aa = pack("ddddd", 255,123,0,45,123); 
print length($aa)."\n"; 
# Prints 40 

@unparray = unpack("d "x5, $aa); 
print scalar(@unparray)."\n"; 
# Prints 5 

print length($unparray[0])."\n" 
# Prints 3 

printf "%d\n", $unparray[0] ' 
# Prints 255 

# As a one-liner: 
# perl -e '$a = pack("d",255); print length($a)."\n"; $aa = pack("dd", 255,123,0,45,123); print length($aa)."\n"; @unparray = unpack("d "x5, $aa); print scalar(@unparray)."\n"; print length($unparray[0])."\n"; printf "%d\n", $unparray[0] ' 

지금, 나는이 배정 밀도 부동 소수점은 8 바이트 것으로 기대. 하지만 포장을 풀 때 길이가 왜보고합니까? (length($unparray[0])) 정확히 같은 방식 (배정도, 즉 8 바이트)으로 돌아가려고 할 때 3 항목 (255)의 값이 올바르게 보존됩니까?

답변

5

포장 한 것의 포장을 풀면 원래 값을 되찾았으며 첫 번째 값은 255입니다. 255의 문자열은 255 자이며 3 자 길이로 이 알려줍니다.

+0

고맙습니다. @hobbs; pack은 Integer에서 "double-value packed bytestring"으로 이동합니다. 다른 방법으로 (언팩), 나는 어떻게 든'unparray'에서 double-precision float에 "double-value packed bytestring"을 얻을 것이라고 예상했다; 하지만 그것들은'$ unparray'의 문자열입니다! 이것을 명확히 해 주셔서 감사합니다 - 건배! – sdaau

+4

@sdaau,'@ unparray'에서 배정도 수레를 얻습니다. 'length'는 string의 길이를 찾습니다. 그래서 문자열이 필요합니다. 그래서 필요한 경우 인수를 문자열로 나타냅니다. – ikegami

+0

@ ikegami 주셔서 감사합니다 - "길이는 문자열의 길이를 찾습니다"내가 이해하지 못한 걸림돌이었던 것 같습니다. 건배! – sdaau