trailing spaces in unpack("A10")

Discussion in 'Perl Misc' started by Klaus, May 8, 2008.

  1. Klaus

    Klaus Guest

    According to "perldoc perlpacktut", I could use unpack to extract
    fixed length fields:

    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
    Klaus, May 8, 2008
    #1
    1. Advertising

  2. Klaus

    Uri Guttman Guest

    >>>>> "K" == Klaus <> writes:

    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 ------ -------- 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 ---------
    Uri Guttman, May 8, 2008
    #2
    1. Advertising

  3. Klaus

    Klaus Guest

    On May 8, 11:16 pm, Sherman Pendley <> wrote:
    > Klaus <> writes:
    > > 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?


    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
    Klaus, May 8, 2008
    #3
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Les Caudle
    Replies:
    0
    Views:
    601
    Les Caudle
    Mar 7, 2004
  2. Ben
    Replies:
    5
    Views:
    2,111
    jongalloway
    Jan 16, 2005
  3. John B. Matthews
    Replies:
    4
    Views:
    655
    John B. Matthews
    Sep 12, 2008
  4. Roedy Green
    Replies:
    3
    Views:
    613
  5. johkar
    Replies:
    2
    Views:
    2,848
    Mayeul
    Dec 10, 2009
Loading...

Share This Page