Support one-parameter unpack(), which unpacks $_.
Chip Salzenberg [Wed, 19 Feb 2003 03:54:45 +0000 (03:54 +0000)]
p4raw-id: //depot/perl@18751

opcode.h
opcode.pl
pod/perlfunc.pod
pp_pack.c
t/op/pack.t

index b77c0a8..62bf30d 100644 (file)
--- a/opcode.h
+++ b/opcode.h
@@ -1614,7 +1614,7 @@ EXT U32 PL_opargs[] = {
        0x00000248,     /* rv2hv */
        0x00028404,     /* helem */
        0x00048801,     /* hslice */
-       0x00022800,     /* unpack */
+       0x00122800,     /* unpack */
        0x0004280d,     /* pack */
        0x00222808,     /* split */
        0x0004280d,     /* join */
index 4aacb2d..c92aad4 100755 (executable)
--- a/opcode.pl
+++ b/opcode.pl
@@ -626,7 +626,7 @@ hslice              hash slice              ck_null         m@      H L
 
 # Explosives and implosives.
 
-unpack         unpack                  ck_fun          @       S S
+unpack         unpack                  ck_fun          @       S S?
 pack           pack                    ck_fun          mst@    S L
 split          split                   ck_split        t@      S S S
 join           join or string          ck_join         mst@    S L
index 355ada8..7fed9c0 100644 (file)
@@ -5944,10 +5944,14 @@ If LIST is omitted, uses C<$_>.
 
 =item unpack TEMPLATE,EXPR
 
+=item unpack TEMPLATE
+
 C<unpack> does the reverse of C<pack>: it takes a string
 and expands it out into a list of values.
 (In scalar context, it returns merely the first value produced.)
 
+If EXPR is omitted, unpacks the C<$_> string.
+
 The string is broken into chunks described by the TEMPLATE.  Each chunk
 is converted separately to a value.  Typically, either the string is a result
 of C<pack>, or the bytes of the string represent a C structure of some
index 4476454..6f9abe1 100644 (file)
--- a/pp_pack.c
+++ b/pp_pack.c
@@ -1606,7 +1606,8 @@ Perl_unpack_str(pTHX_ char *pat, register char *patend, register char *s, char *
 PP(pp_unpack)
 {
     dSP;
-    dPOPPOPssrl;
+    SV *right = (MAXARG > 1) ? POPs : GvSV(PL_defgv);
+    SV *left = POPs;
     I32 gimme = GIMME_V;
     STRLEN llen;
     STRLEN rlen;
index a4c5db0..1c971c6 100755 (executable)
@@ -6,7 +6,7 @@ BEGIN {
     require './test.pl';
 }
 
-plan tests => 5826;
+plan tests => 5827;
 
 use strict;
 use warnings;
@@ -995,3 +995,5 @@ foreach my $template (qw(A Z c C s S i I l L n N v V q Q j J f d F D u U w)) {
 
 ok(pack('u2', 'AA'), "[perl #8026]"); # used to hang and eat RAM in perl 5.7.2
 
+$_ = 'A';
+ok(unpack('c') == 65); # defaulting to $_