open(FP,"f20.dat"); # Open MetaStock DATA File :> read (FP, $buf, 0x1c); # Skip header for 7 fields $i = 0; while (!eof(FP)) { read(FP, $buf, 0x1c); # Fetch 7 fields data ($date, $open, $high, $low, $close, $volume, $opt) = unpack("A4 A4 A4 A4 A4 A4 A4", $buf); ## Although they are float but I fetch them as strings. $date = mem2date($date); $open = mem2date($open); $high = mem2date($high); $low = mem2date($low); $close = mem2date($close); $volume = mem2date($volume); print "$date $open $high $low $close $volume\n"; ++$i; last if ($i > 10); ### I want see only first 10 records. } close(FP); ####################################### sub mem2date { my $mem = $_[0]; my ($a, $b, $c, $d) = unpack ("C C C C", $mem); # /* MS Binary Format */ # /* byte order => m3 | m2 | m1 | exponent */ # /* m1 is most significant byte => sbbb|bbbb */ # /* m3 is the least significant byte */ # /* m = mantissa byte */ # /* s = sign bit */ # /* b = bit */ # sign = msbin[2] & 0x80; /* 1000|0000b */ # /* IEEE Single Precision Float Format */ # /* m3 m2 m1 exponent */ # /* mmmm|mmmm mmmm|mmmm emmm|mmmm seee|eeee */ # /* s = sign bit */ # /* e = exponent bit */ # /* m = mantissa bit */ my ($msexp, $man, $sign, $iexp, $newc, $newd); $msexp = $d; $man = $c & 0x7f; $sign = $c & 0x80; $iexp = $msexp - 2; ## This line is very necessary because MS is bias 128 but IEEE is bias 127 $newd = ($iexp >> 1) | $sign; $newc = ($iexp << 7) | $man; $c = $newc; $d = $newd; return unpack("f",pack("CCCC",$a, $b, $c, $d)); } --- End of Sample Code ---