1Perl6::Slurp(3) User Contributed Perl Documentation Perl6::Slurp(3)
2
3
4
6 Perl6::Slurp - Implements the Perl 6 'slurp' built-in
7
9 use Perl6::Slurp;
10
11 # Slurp a file by name...
12
13 $file_contents = slurp 'filename';
14 $file_contents = slurp '<filename';
15 $file_contents = slurp '<', 'filename';
16 $file_contents = slurp '+<', 'filename';
17
18
19 # Slurp a file via an (already open!) handle...
20
21 $file_contents = slurp \*STDIN;
22 $file_contents = slurp $filehandle;
23 $file_contents = slurp IO::File->new('filename');
24
25
26 # Slurp a string...
27
28 $str_contents = slurp \$string;
29 $str_contents = slurp '<', \$string;
30
31
32 # Slurp a pipe (not on Windows, alas)...
33
34 $str_contents = slurp 'tail -20 $filename |';
35 $str_contents = slurp '-|', 'tail', -20, $filename;
36
37
38 # Slurp with no source slurps from whatever $_ indicates...
39
40 for (@files) {
41 $contents .= slurp;
42 }
43
44 # ...or from the entire ARGV list, if $_ is undefined...
45
46 $_ = undef;
47 $ARGV_contents = slurp;
48
49
50 # Specify I/O layers as part of mode...
51
52 $file_contents = slurp '<:raw', $file;
53 $file_contents = slurp '<:utf8', $file;
54 $file_contents = slurp '<:raw :utf8', $file;
55
56
57 # Specify I/O layers as separate options...
58
59 $file_contents = slurp $file, {raw=>1};
60 $file_contents = slurp $file, {utf8=>1};
61 $file_contents = slurp $file, {raw=>1}, {utf8=>1};
62 $file_contents = slurp $file, [raw=>1, utf8=>1];
63
64
65 # Specify input record separator...
66
67 $file_contents = slurp $file, {irs=>"\n\n"};
68 $file_contents = slurp '<', $file, {irs=>"\n\n"};
69 $file_contents = slurp {irs=>"\n\n"}, $file;
70
71
72 # Input record separator can be regex...
73
74 $file_contents = slurp $file, {irs=>qr/\n+/};
75 $file_contents = slurp '<', $file, {irs=>qr/\n+|\t{2,}};
76
77
78 # Specify autochomping...
79
80 $file_contents = slurp $file, {chomp=>1};
81 $file_contents = slurp {chomp=>1}, $file;
82 $file_contents = slurp $file, {chomp=>1, irs=>"\n\n"};
83 $file_contents = slurp $file, {chomp=>1, irs=>qr/\n+/};
84
85
86 # Specify autochomping that replaces irs
87 # with another string...
88
89 $file_contents = slurp $file, {irs=>"\n\n", chomp=>"\n"};
90 $file_contents = slurp $file, {chomp=>"\n\n"}, {irs=>qr/\n+/};
91
92
93 # Specify autochomping that replaces
94 # irs with a dynamically computed string...
95
96 my $n = 1;
97 $file_contents = slurp $file, {chomp=>sub{ "\n#line ".$n++."\n"};
98
99
100 # Slurp in a list context...
101
102 @lines = slurp 'filename';
103 @lines = slurp $filehandle;
104 @lines = slurp \$string;
105 @lines = slurp '<:utf8', 'filename', {irs=>"\x{2020}", chomp=>"\n"};
106
108 "slurp" takes:
109
110 • a filename,
111
112 • a filehandle,
113
114 • a typeglob reference,
115
116 • an IO::File object, or
117
118 • a scalar reference,
119
120 converts it to an input stream (using open() if necessary), and reads
121 in the entire stream. If "slurp" fails to set up or read the stream, it
122 throws an exception.
123
124 If no data source is specified "slurp" uses the value of $_ as the
125 source. If $_ is undefined, "slurp" uses the @ARGV list, and magically
126 slurps the contents of all the sources listed in @ARGV. Note that the
127 same magic is also applied if you explicitly slurp <*ARGV>, so the
128 following three input operations:
129
130 $contents = join "", <ARGV>;
131
132 $contents = slurp \*ARGV;
133
134 $/ = undef;
135 $contents = slurp;
136
137 are identical in effect.
138
139 In a scalar context "slurp" returns the stream contents as a single
140 string. If the stream is at EOF, it returns an empty string. In a
141 list context, it splits the contents after the appropriate input record
142 separator and returns the resulting list of strings.
143
144 You can set the input record separator ("{ irs => $your_irs_here}") for
145 the input operation. The separator can be specified as a string or a
146 regex. Note that an explicit input record separator has no input-
147 terminating effect in a scalar context; "slurp" always reads in the
148 entire input stream, whatever the 'irs' value.
149
150 In a list context, changing the separator can change how the input is
151 broken up within the list that is returned.
152
153 If an input record separator is not explicitly specified, "slurp"
154 defaults to "\n" (not to the current value of $/ – since Perl 6 doesn't
155 have a $/);
156
157 You can also tell "slurp" to automagically "chomp" the input as it is
158 read in, by specifying: ("{ chomp => 1 }")
159
160 Better still, you can tell "slurp" to automagically "chomp" the input
161 and replace what it chomps with another string, by specifying:
162 ("{ chomp => "another string" }")
163
164 You can also tell "slurp" to compute the replacement string on-the-fly
165 by specifying a subroutine as the "chomp" value:
166 ("{ chomp => sub{...} }"). This subroutine is passed the string being
167 chomped off, so for example you could squeeze single newlines to a
168 single space and multiple consecutive newlines to a two newlines with:
169
170 sub squeeze {
171 my ($removed) = @_;
172 if ($removed =~ tr/\n/\n/ == 1) { return " " }
173 else { return "\n\n"; }
174 }
175
176 print slurp(\*DATA, {irs=>qr/[ \t]*\n+/, chomp=>\&squeeze}), "\n";
177
178 Which would transform:
179
180 This is the
181 first paragraph
182
183
184 This is the
185 second
186 paragraph
187
188 This, the
189 third
190
191
192
193
194 This one is
195 the
196 very
197 last
198
199 to:
200
201 This is the first paragraph
202
203 This is the second paragraph
204
205 This, the third
206
207 This one is the very last
208
209 Autochomping works in both scalar and list contexts. In scalar contexts
210 every instance of the input record separator will be removed (or
211 replaced) within the returned string. In list context, each list item
212 returned with its terminating separator removed (or replaced).
213
214 You can specify I/O layers, either using the Perl 5 notation:
215
216 slurp "<:layer1 :layer2 :etc", $filename;
217
218 or as an array of options:
219
220 slurp $filename, [layer1=>1, layer2=>1, etc=>1];
221 slurp [layer1=>1, layer2=>1, etc=>1], $filename;
222
223 or as individual options (each of which must be in a separate hash):
224
225 slurp $filename, {layer1=>1}, {layer2=>1}, {etc=>1};
226 slurp {layer1=>1}, {layer2=>1}, {etc=>1}, $filename;
227
228 (...which, of course, would look much cooler in Perl 6:
229
230 # Perl 6 only :-(
231
232 slurp $filename, :layer1 :layer2 :etc;
233 slurp :layer1 :layer2 :etc, $filename;
234
235 )
236
237 A common mistake is to put all the options together in one hash:
238
239 slurp $filename, {layer1=>1, layer2=>1, etc=>1};
240
241 This is almost always a disaster, since the order of I/O layers is
242 usually critical, and placing them all in one hash effectively
243 randomizes that order. Use an array instead:
244
245 slurp $filename, [layer1=>1, layer2=>1, etc=>1];
246
248 The syntax and semantics of Perl 6 is still being finalized and
249 consequently is at any time subject to change. That means the same
250 caveat applies to this module.
251
252 When called with a filename or piped shell command, slurp() uses Perl's
253 built- in open() to access the file. This means that it is subject to
254 the same platform-specific limitations as open(). For example,
255 slurping from piped shell commands may not work under Windows.
256
258 Requires: Perl 5.8.0
259
261 Damian Conway (damian@conway.org)
262
264 Copyright (c) 2003-2012, Damian Conway. All Rights Reserved.
265 This module is free software. It may be used, redistributed
266 and/or modified under the same terms as Perl itself.
267
268
269
270perl v5.36.0 2023-01-20 Perl6::Slurp(3)