Pretending a String Is a File (Perl Cookbook, 2nd Edition)

## 8.23. Pretending a String Is a File

### 8.23.1. Problem

You have data in string, but would like to treat it as a file. For example, you have a subroutine that expects a filehandle as an argument, but you would like that subroutine to work directly on the data in your string instead. Additionally, you don't want to write the data to a temporary file.

### 8.23.2. Solution

Use the scalar I/O in Perl v5.8:

>     open($fh, "+<", \$string);   # read and write contents of $string

### 8.23.3. Discussion

Perl's I/O layers include support for input and output from a scalar. When you read a record with `<$fh>`, you are reading the next line from `$string`. When you write a record with `print`, you change `$string`. You can pass `$fh` to a function that expects a filehandle, and that subroutine need never know that it's really working with data in a string.

Perl respects the various access modes in `open` for strings, so you can specify that the strings be opened as read-only, with truncation, in append mode, and so on:

>     open($fh, "<",  \$string);   # read only
>     open($fh, ">",  \$string);   # write only, discard original contents
>     open($fh, "+>", \$string);   # read and write, discard original contents
>     open($fh, "+<", \$string);   # read and write, preserve original contents

These handles behave in all respects like regular filehandles, so all I/O functions work, such as `seek`, `truncate`, `sysread`, and friends.

### 8.23.4. See Also

The `open` function in perlfunc(1) and in Chapter 29 of Programming Perl; Recipe 8.12 and Recipe 8.19

Copyright © 2003 O'Reilly & Associates. All rights reserved.