Hi Edward:  Two ideas:

One, try using the newer style file open:

open my $fh, '<', $file or die "Cannot open $file";
binmode($fh); # not sure if this is necessary (probably not on unix)
my $header = readflex($fh, $hdr);

(not tested!)

I don't think its usual practice to pass raw file handles to routines:

readflex(AREA, $hdr)

The newer form of open gets around this problem.

Secondly, it is sad that PDL does not have an unsigned long type, but you 
can often get away with using a signed long and then 'undoing' the sign 
bit manually and casting to a double:

perldl> p $toobig =  (2**31 + 1)
2147483649
perldl> p long($toobig)
-2147483648
perldl> p double(long($toobig) + (2**32 + 1))
2147483649

Regards,

   Doug Hunt


[email protected]
Software Engineer IV
UCAR - COSMIC, Tel. (303) 497-2611

On Mon, 9 Mar 2009, Hyer, Dr. Edward wrote:

> Craig,
>
> You're right: 'long' works fine for this application. Thanks!
>
> I did get readflex() to work, but only by giving it the filename rather
> than the filehandle. As in, this works:
>
> $file='/path/to/file.dat';
> $hdr=[{NDims=>1,Dims=>[64],Type=>'long'}]
> $header=readflex($file,$hdr);
>
> This does not:
>
> open(AREA,"<$file");
> binmode(AREA)
> $header=readflex(AREA,$hdr);
>
> Error is 'PDL: Couldn't open 'AREA' for reading.'
>
> What am I doing wrong?
>
> --Edward H.
>
>> -----Original Message-----
>> From: Craig DeForest [mailto:[email protected]]
>> Sent: Sunday, March 08, 2009 9:54 PM
>> To: Hyer, Dr. Edward
>> Cc: Craig DeForest; [email protected]
>> Subject: Re: [Perldl] Simple stuff: PDL::IO::FlexRaw and data types
>>
>> Hi, Edward,
>>
>> You're right, PDL doesn't have a ulong type -- only a ushort.
>>  Since your values aren't likely to be larger than 2**31, you
>> are probably OK
>> just using "long" rather than "ulong".   That might be the source of
>> your readflex error, too; why not try it with "long" instead
>> of "ulong"?
>>
>> Cheers,
>> Craig
>>
>>
>> On Mar 8, 2009, at 10:22 PM, Hyer, Dr. Edward wrote:
>>
>>> Hello PDL Wizards,
>>>
>>> Always embarrassed to ask easy questions, but I'm stumped.
>>>
>>> Trying to set up and read from a raw binary file (from
>> someone else).
>>> File has a 64-item,unsigned-long header, which must be
>> queried to find
>>> the start and dimensions of the data block. Cribbing
>> directly from the
>>> FlexRaw docs, I did this:
>>>
>>> open(AREA,"<$file2");
>>> binmode(AREA)
>>> $head = readflex(AREA, [{NDims=>1, Dims=>[64], Type='ulong'}])
>>> $pixels=$head->(9)
>>> $lines=$head->(8)
>>> $datastart=$head->(33)
>>> seek(AREA,($pixels * $lines)+$datastart,0) $areadata =
>> readflex(AREA,
>>> [{NDims=>2, Dims=>[$pixels,$lines],
>>> Type='byte'}])
>>> close(AREA);
>>>
>>> Two questions:
>>>
>>> 1) I can't get past the first readflex(), because of this error:
>>>
>>> Can't modify constant item in scalar assignment at (eval
>> 119) line 4,
>>> at EOF
>>>
>>> 2) Does PDL actually have a 'ulong' type? (32-bit unsigned)
>>>
>>> Thanks,
>>>
>>>
>>> --Edward H.
>>>
>>> _______________________________________________
>>> Perldl mailing list
>>> [email protected]
>>> http://mailman.jach.hawaii.edu/mailman/listinfo/perldl
>>>
>>
>>
>
> _______________________________________________
> Perldl mailing list
> [email protected]
> http://mailman.jach.hawaii.edu/mailman/listinfo/perldl
>

_______________________________________________
Perldl mailing list
[email protected]
http://mailman.jach.hawaii.edu/mailman/listinfo/perldl

Reply via email to