from "perldoc perlpacktut":
+++++++++++++++++++++++++++++++++++++
++ [...] we can see that the date column stretches from
++ column 1 to column 10 - ten characters wide. The
++ pack-ese for "character" is A, and ten of them are
++ A10. So if we just wanted to extract the dates, we
++ could say this:
++
++ my($date) = unpack("A10", $_);
+++++++++++++++++++++++++++++++++++++
So I have created a test case with 3 A's then 7 spaces, followed by 3
B's:
use strict;
use warnings;
$_ = 'AAA BBB';
my $result = unpack("A10", $_);
print "result = '$result'\n";
This is the output:
result = 'AAA'
It basically works, but unpack seems to remove trailing spaces.
To my understanding of "perldoc perlpacktut", the output should show
as result a field of 10 characters (3 A's followed by 7 spaces), but
actually it only shows 3 A's.
Where have the 7 spaces gone ?
I can easily fill up the missing spaces with an sprintf("%-10s"), but
can somebody point me to the documentation where it says that
unpack("A10") removes trailing spaces ?
btw, I am using perl 5.10 under Win XP
--
Klaus
K> According to "perldoc perlpacktut", I could use unpack to extract
K> fixed length fields:
K> from "perldoc perlpacktut":
K> +++++++++++++++++++++++++++++++++++++
K> ++ [...] we can see that the date column stretches from
K> ++ column 1 to column 10 - ten characters wide. The
K> ++ pack-ese for "character" is A, and ten of them are
K> ++ A10. So if we just wanted to extract the dates, we
K> ++ could say this:
K> ++
K> ++ my($date) = unpack("A10", $_);
K> +++++++++++++++++++++++++++++++++++++
K> So I have created a test case with 3 A's then 7 spaces, followed by 3
K> B's:
K> use strict;
K> use warnings;
K> $_ = 'AAA BBB';
K> my $result = unpack("A10", $_);
K> print "result = '$result'\n";
K> This is the output:
K> result = 'AAA'
K> It basically works, but unpack seems to remove trailing spaces.
from perldoc -f pack:
The "a", "A", and "Z" types gobble just one value, but pack it
as a string of length count, padding with nulls or spaces as
necessary. When unpacking, "A" strips trailing spaces and
nulls, "Z" strips everything after the first null, and "a"
returns data verbatim. When packing, "a", and "Z" are
equivalent.
K> Where have the 7 spaces gone ?
where the docs said they would go. use the 'a' format to keep the spaces.
uri
--
Uri Guttman ------ u...@stemsystems.com -------- http://www.sysarch.com --
----- Perl Code Review , Architecture, Development, Training, Support ------
--------- Free Perl Training --- http://perlhunter.com/college.html ---------
--------- Gourmet Hot Cocoa Mix ---- http://bestfriendscocoa.com ---------
> use strict;
> use warnings;
> $_ = 'AAA BBB';
> my $result = unpack("A10", $_);
> print "result = '$result'\n";
>
> This is the output:
> result = 'AAA'
>
> It basically works, but unpack seems to remove trailing spaces.
Have a look at 'perldoc -f pack' - A capital 'A' indicates that the field
will be space-padded. It seems that unpack is doing the opposite, removing
any trailing spaces.
A lowercase 'a' indicates a null-padded string - what happens when you use
that instead?
sherm--
--
My blog: http://shermspace.blogspot.com
Cocoa programming in Perl: http://camelbones.sourceforge.net
That's it, lowercase 'a' works fine (i.e. it preserves trailing
spaces). Thanks to you, and to uri, who pointed me to the relevant
part of the documentation.
--
Klaus