in reply to How much was unpack()ed?

Whenever I do much with pack/unpack, I'm reminded that these really need to support stream operations.

unpack needs to be able to read from a stream or, more likely, to start reading at pos($input) and to set pos($input) to note where it left off (in other words, treat the input string as a stream).

You can already do print STREAM pack ... so pack doesn't really need to be able to write to a stream. But it'd be cool if pack supported starting at pos($string) and overwriting as many bytes after that as needed and setting pos($string) to where it left off at.

I even started writing a module to implement such. But I didn't finish and now pack/unpack have gotten quite a bit fancier such that this either needs to be patched directly into pack/unpack or (at least) they need some introspection features added to make implementing these in a module reasonable/possible.

For example "." could be the format for "current seek offset" which you could use like:

my( $z, $zEnd, $i, $iEnd )= unpack "z.I.", $buf; # $zEnd == length($z) # $iEnd == 4 + $zEnd my( $z, $i )= getData(); my $buf= pack "z.I.", $z, my $zEnd, $i, my $iEnd; # $zEnd == length($z) # $iEnd == 4 + $zEnd

- tye