On Dec 9, 2007 7:10 AM, Niu Kun <[EMAIL PROTECTED]> wrote:
snip
> My network protocol is like this:
> String length(4 bytes, big endian) plus the real string.
> For simple simulate purpose, I'll limit the string length to less than 256.
> So I've got one byte containing the length of the string.
> The other end is written in C++.
> I've got a solve method with sprintf.
> But I'd rather use a way more perlish.:)
snip
It sounds like you want something like
use Carp;
sub send_msg {
my ($sock, $msg) = @_;
use bytes;
my $len = length $msg;
no bytes;
my $maxlen = 2**32-1;
croak "$msg is too long (there is a $maxlen byte limit)" if $len > $maxlen;
print $sock pack "Na*", $len, $msg;
}
if you are going to use the four byte big-endian length or
use Carp;
sub send_msg {
my ($sock, $msg) = @_;
use bytes;
my $len = length $msg;
no bytes;
my $maxlen = 2**32-1;
croak "$msg is too long (there is a $maxlen byte limit)" if $len > $maxlen;
print $sock pack "Ca*", $len, $msg;
}
if you are going to use the one byte length. It is important that you
use the bytes pragma. As I said before, Perl strings are in UTF-8.
The length function returns the number of characters (not the number
of bytes) by default. This behavior can be overridden with the bytes
pragma:
#!/usr/bin/perl
use warnings;
use strict;
my $msg = chr(0x263a);
my $length = length $msg;
use bytes;
my $bytes = length $msg;
no bytes;
print "$msg is $length character(s) long and $bytes byte(s) long\n";
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/