This should give us the correct value for the Content-Length header

No.

If the XML is valid, length gives the right answer without use bytes:

$ perl -le' $_ = "<?xml version=\"1.0\"?><root>\x{C9}ric</root>"; utf8::encode($_); utf8::downgrade($_); print length; print do { use bytes; length }; ' 39 39

You can get the wrong answer if you use use bytes;:

$ perl -le' $_ = "<?xml version=\"1.0\"?><root>\x{C9}ric</root>"; utf8::encode($_); utf8::upgrade($_); print length; print do { use bytes; length }; ' 39 41 XXX Should be 39

If the XML hasn't been encoded, use bytes can give you the right result if the desired encoding is UTF-8, but it's unreliable:

$ perl -le' $_ = "<?xml version=\"1.0\"?><root>\x{C9}ric</root>"; print do { use bytes; length }; ' 38 XXX Should be 39

In no case is use bytes; the appropriate answer.

Perl has two different formats for storing strings. use bytes; causes opcodes to look directly at the internal buffer of the string no matter which format was used. Since Perl is free to change how it internally stores the string at will, it's quite useless to use use bytes; without taking into checking which format Perl used for that string.

Update: Rephrased for clarity.


In reply to Re^6: Determining content-length for an HTTP Post by ikegami
in thread Determining content-length for an HTTP Post by Anonymous Monk

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.