From: brian d foy Date: Sat, 21 Aug 2010 15:47:37 +0000 (-0500) Subject: * How can I write() into a string? X-Git-Tag: v5.13.5~67 X-Git-Url: https://perl5.git.perl.org/perl5.git/commitdiff_plain/3cd7ab715194be8ea797d7f907f547c571ec12f2 * How can I write() into a string? + Actually answer the question, now that we have filehandles to strings. + The swrite in perlform is no good anyway. --- diff --git a/pod/perlfaq5.pod b/pod/perlfaq5.pod index bd969f4..683910e 100644 --- a/pod/perlfaq5.pod +++ b/pod/perlfaq5.pod @@ -644,7 +644,54 @@ techniques to make it possible for the intrepid hacker. =head2 How can I write() into a string? X -See L for an C function. +(contributed by brian d foy) + +If you want to C into a string, you just have to a +filehandle to a string, which Perl has been able to do since Perl 5.6: + + open FH, '>', \my $string; + write( FH ); + +Since you want to be a good programmer, you probably want to use a lexical +filehandle, even though formats are designed to work with bareword filehandles +since the default format names take the filehandle name. However, you can +control this with some Perl special per-filehandle variables: C<$^>, which +names the top-of-page format, and C<$~> which shows the line format. You have +to change the default filehandle to set these variables: + + open my($fh), '>', \my $string; + + { # set per-filehandle variables + my $old_fh = select( $fh ); + $~ = 'ANIMAL'; + $^ = 'ANIMAL_TOP'; + select( $old_fh ); + } + + format ANIMAL_TOP = + ID Type Name + . + + format ANIMAL = + @## @<<< @<<<<<<<<<<<<<< + $id, $type, $name + . + +Although write can work with lexical or package variables, whatever variables +you use have to scope in the format. That most likely means you'll want to +localize some package variables: + + { + local( $id, $type, $name ) = qw( 12 cat Buster ); + write( $fh ); + } + + print $string; + +There are also some tricks that you can play with C and the +accumulator variable C<$^A>, but you lose a lot of the value of formats +since C won't handle paging and so on. You end up reimplementing +formats when you use them. =head2 How can I open a filehandle to a string? X X X X