Commit | Line | Data |
---|---|---|
0d863452 RH |
1 | #!./perl |
2 | ||
3 | BEGIN { | |
4 | chdir 't'; | |
5 | @INC = '../lib'; | |
6 | require './test.pl'; | |
7 | } | |
8 | use strict; | |
289d21b2 RGS |
9 | use warnings; |
10 | no warnings 'uninitialized'; | |
0d863452 RH |
11 | |
12 | use Tie::Array; | |
13 | use Tie::Hash; | |
14 | ||
0d863452 | 15 | # Predeclare vars used in the tests: |
031a44ed RGS |
16 | my @empty; |
17 | my %empty; | |
015eb7b9 | 18 | my @sparse; $sparse[2] = 2; |
031a44ed | 19 | |
1144115d RGS |
20 | my $deep1 = []; push @$deep1, $deep1; |
21 | my $deep2 = []; push @$deep2, $deep2; | |
0d863452 | 22 | |
0d863452 RH |
23 | my @nums = (1..10); |
24 | tie my @tied_nums, 'Tie::StdArray'; | |
25 | @tied_nums = (1..10); | |
26 | ||
27 | my %hash = (foo => 17, bar => 23); | |
28 | tie my %tied_hash, 'Tie::StdHash'; | |
29 | %tied_hash = %hash; | |
30 | ||
1cfb7049 YK |
31 | { |
32 | package Test::Object::NoOverload; | |
33 | sub new { bless { key => 1 } } | |
34 | } | |
35 | ||
36 | { | |
6fbc735b RGS |
37 | package Test::Object::StringOverload; |
38 | use overload '""' => sub { "object" }, fallback => 1; | |
39 | sub new { bless { key => 1 } } | |
40 | } | |
41 | ||
42 | { | |
90a32bcb | 43 | package Test::Object::WithOverload; |
6fbc735b | 44 | sub new { bless { key => ($_[1] // 'magic') } } |
2c9d2554 RGS |
45 | use overload '~~' => sub { |
46 | my %hash = %{ $_[0] }; | |
47 | if ($_[2]) { # arguments reversed ? | |
48 | return $_[1] eq reverse $hash{key}; | |
49 | } | |
50 | else { | |
51 | return $_[1] eq $hash{key}; | |
52 | } | |
53 | }; | |
0483c672 | 54 | use overload '""' => sub { "stringified" }; |
90a32bcb | 55 | use overload 'eq' => sub {"$_[0]" eq "$_[1]"}; |
1cfb7049 YK |
56 | } |
57 | ||
90a32bcb | 58 | our $ov_obj = Test::Object::WithOverload->new; |
6fbc735b | 59 | our $ov_obj_2 = Test::Object::WithOverload->new("object"); |
1cfb7049 | 60 | our $obj = Test::Object::NoOverload->new; |
6fbc735b | 61 | our $str_obj = Test::Object::StringOverload->new; |
1cfb7049 | 62 | |
c5836baf | 63 | my %refh; |
d3d1232e NC |
64 | unless (is_miniperl()) { |
65 | require Tie::RefHash; | |
c5836baf RGS |
66 | tie %refh, 'Tie::RefHash'; |
67 | $refh{$ov_obj} = 1; | |
68 | } | |
b15feb55 | 69 | |
73aec0b1 RGS |
70 | my @keyandmore = qw(key and more); |
71 | my @fooormore = qw(foo or more); | |
72 | my %keyandmore = map { $_ => 0 } @keyandmore; | |
73 | my %fooormore = map { $_ => 0 } @fooormore; | |
74 | ||
0d863452 | 75 | # Load and run the tests |
b900a653 | 76 | plan tests => 349; |
0d863452 | 77 | |
9e079ace | 78 | while (<DATA>) { |
c5836baf | 79 | SKIP: { |
9e079ace RGS |
80 | next if /^#/ || !/\S/; |
81 | chomp; | |
73aec0b1 | 82 | my ($yn, $left, $right, $note) = split /\t+/; |
0d863452 | 83 | |
73aec0b1 | 84 | local $::TODO = $note =~ /TODO/; |
0d863452 | 85 | |
85af77a5 | 86 | die "Bad test spec: ($yn, $left, $right)" if $yn =~ /[^!@=]/; |
9e079ace | 87 | |
0d863452 | 88 | my $tstr = "$left ~~ $right"; |
9e079ace | 89 | |
85af77a5 | 90 | test_again: |
289d21b2 RGS |
91 | my $res; |
92 | if ($note =~ /NOWARNINGS/) { | |
93 | $res = eval "no warnings; $tstr"; | |
94 | } | |
95 | else { | |
d3d1232e NC |
96 | skip_if_miniperl("Doesn't work with miniperl", $yn =~ /=/ ? 2 : 1) |
97 | if $note =~ /MINISKIP/; | |
289d21b2 RGS |
98 | $res = eval $tstr; |
99 | } | |
0d863452 | 100 | |
a86f5011 YK |
101 | chomp $@; |
102 | ||
85af77a5 | 103 | if ( $yn =~ /@/ ) { |
9e079ace RGS |
104 | ok( $@ ne '', "$tstr dies" ) |
105 | and print "# \$\@ was: $@\n"; | |
a86f5011 | 106 | } else { |
85af77a5 | 107 | my $test_name = $tstr . ($yn =~ /!/ ? " does not match" : " matches"); |
a86f5011 | 108 | if ( $@ ne '' ) { |
9e079ace RGS |
109 | fail($test_name); |
110 | print "# \$\@ was: $@\n"; | |
a86f5011 | 111 | } else { |
85af77a5 | 112 | ok( ($yn =~ /!/ xor $res), $test_name ); |
a86f5011 YK |
113 | } |
114 | } | |
85af77a5 RGS |
115 | |
116 | if ( $yn =~ s/=// ) { | |
117 | $tstr = "$right ~~ $left"; | |
118 | goto test_again; | |
119 | } | |
c5836baf | 120 | } |
0d863452 RH |
121 | } |
122 | ||
0d863452 | 123 | sub foo {} |
73aec0b1 RGS |
124 | sub bar {42} |
125 | sub gorch {42} | |
1cfb7049 | 126 | sub fatal {die "fatal sub\n"} |
0d863452 | 127 | |
0cfbf1ea | 128 | # to test constant folding |
18d11902 RGS |
129 | sub FALSE() { 0 } |
130 | sub TRUE() { 1 } | |
2522c35a | 131 | sub NOT_DEF() { undef } |
0d863452 | 132 | |
e5de85fa RGS |
133 | # Prefix character : |
134 | # - expected to match | |
135 | # ! - expected to not match | |
136 | # @ - expected to be a compilation failure | |
85af77a5 | 137 | # = - expected to match symmetrically (runs test twice) |
73aec0b1 | 138 | # Data types to test : |
85af77a5 | 139 | # undef |
73aec0b1 RGS |
140 | # Object-overloaded |
141 | # Object | |
73aec0b1 RGS |
142 | # Coderef |
143 | # Hash | |
144 | # Hashref | |
145 | # Array | |
146 | # Arrayref | |
85af77a5 RGS |
147 | # Tied arrays and hashes |
148 | # Arrays that reference themselves | |
73aec0b1 | 149 | # Regex (// and qr//) |
85af77a5 | 150 | # Range |
73aec0b1 RGS |
151 | # Num |
152 | # Str | |
85af77a5 RGS |
153 | # Other syntactic items of interest: |
154 | # Constants | |
155 | # Values returned by a sub call | |
0d863452 | 156 | __DATA__ |
85af77a5 | 157 | # Any ~~ undef |
ad0781bc | 158 | ! $ov_obj undef |
85af77a5 RGS |
159 | ! $obj undef |
160 | ! sub {} undef | |
161 | ! %hash undef | |
162 | ! \%hash undef | |
163 | ! {} undef | |
164 | ! @nums undef | |
165 | ! \@nums undef | |
166 | ! [] undef | |
167 | ! %tied_hash undef | |
168 | ! @tied_nums undef | |
169 | ! $deep1 undef | |
170 | ! /foo/ undef | |
171 | ! qr/foo/ undef | |
172 | ! 21..30 undef | |
173 | ! 189 undef | |
174 | ! "foo" undef | |
175 | ! "" undef | |
176 | ! !1 undef | |
177 | undef undef | |
62ec5f58 | 178 | (my $u) undef |
2522c35a RGS |
179 | NOT_DEF undef |
180 | &NOT_DEF undef | |
85af77a5 RGS |
181 | |
182 | # Any ~~ object overloaded | |
ad0781bc | 183 | ! \&fatal $ov_obj |
2c9d2554 RGS |
184 | 'cigam' $ov_obj |
185 | ! 'cigam on' $ov_obj | |
532217f1 RGS |
186 | ! ['cigam'] $ov_obj |
187 | ! ['stringified'] $ov_obj | |
188 | ! { cigam => 1 } $ov_obj | |
189 | ! { stringified => 1 } $ov_obj | |
ad0781bc RGS |
190 | ! $obj $ov_obj |
191 | ! undef $ov_obj | |
1cfb7049 YK |
192 | |
193 | # regular object | |
ad0781bc | 194 | @ $obj $obj |
6d743019 | 195 | @ $ov_obj $obj |
2c9d2554 | 196 | =@ \&fatal $obj |
ad0781bc RGS |
197 | @ \&FALSE $obj |
198 | @ \&foo $obj | |
199 | @ sub { 1 } $obj | |
200 | @ sub { 0 } $obj | |
201 | @ %keyandmore $obj | |
202 | @ {"key" => 1} $obj | |
203 | @ @fooormore $obj | |
204 | @ ["key" => 1] $obj | |
205 | @ /key/ $obj | |
206 | @ qr/key/ $obj | |
207 | @ "key" $obj | |
208 | @ FALSE $obj | |
209 | ||
6fbc735b RGS |
210 | # regular object with "" overload |
211 | @ $obj $str_obj | |
212 | =@ \&fatal $str_obj | |
213 | @ \&FALSE $str_obj | |
214 | @ \&foo $str_obj | |
215 | @ sub { 1 } $str_obj | |
216 | @ sub { 0 } $str_obj | |
217 | @ %keyandmore $str_obj | |
218 | @ {"object" => 1} $str_obj | |
219 | @ @fooormore $str_obj | |
220 | @ ["object" => 1] $str_obj | |
221 | @ /object/ $str_obj | |
222 | @ qr/object/ $str_obj | |
223 | @ "object" $str_obj | |
224 | @ FALSE $str_obj | |
225 | # Those will treat the $str_obj as a string because of fallback: | |
6fbc735b | 226 | |
ad0781bc | 227 | # object (overloaded or not) ~~ Any |
0483c672 RGS |
228 | $obj qr/NoOverload/ |
229 | $ov_obj qr/^stringified$/ | |
532217f1 | 230 | = "$ov_obj" "stringified" |
6fbc735b | 231 | = "$str_obj" "object" |
532217f1 | 232 | != $ov_obj "stringified" |
6fbc735b | 233 | $str_obj "object" |
2c9d2554 RGS |
234 | $ov_obj 'magic' |
235 | ! $ov_obj 'not magic' | |
1cfb7049 | 236 | |
a4a197da RGS |
237 | # ~~ Coderef |
238 | sub{0} sub { ref $_[0] eq "CODE" } | |
239 | %fooormore sub { $_[0] =~ /^(foo|or|more)$/ } | |
240 | ! %fooormore sub { $_[0] =~ /^(foo|or|less)$/ } | |
241 | \%fooormore sub { $_[0] =~ /^(foo|or|more)$/ } | |
242 | ! \%fooormore sub { $_[0] =~ /^(foo|or|less)$/ } | |
243 | +{%fooormore} sub { $_[0] =~ /^(foo|or|more)$/ } | |
244 | ! +{%fooormore} sub { $_[0] =~ /^(foo|or|less)$/ } | |
245 | @fooormore sub { $_[0] =~ /^(foo|or|more)$/ } | |
246 | ! @fooormore sub { $_[0] =~ /^(foo|or|less)$/ } | |
247 | \@fooormore sub { $_[0] =~ /^(foo|or|more)$/ } | |
248 | ! \@fooormore sub { $_[0] =~ /^(foo|or|less)$/ } | |
249 | [@fooormore] sub { $_[0] =~ /^(foo|or|more)$/ } | |
250 | ! [@fooormore] sub { $_[0] =~ /^(foo|or|less)$/ } | |
251 | %fooormore sub{@_==1} | |
252 | @fooormore sub{@_==1} | |
253 | "foo" sub { $_[0] =~ /^(foo|or|more)$/ } | |
254 | ! "more" sub { $_[0] =~ /^(foo|or|less)$/ } | |
73aec0b1 | 255 | /fooormore/ sub{ref $_[0] eq 'Regexp'} |
a4a197da RGS |
256 | qr/fooormore/ sub{ref $_[0] eq 'Regexp'} |
257 | 1 sub{shift} | |
258 | ! 0 sub{shift} | |
259 | ! undef sub{shift} | |
260 | undef sub{not shift} | |
031a44ed RGS |
261 | NOT_DEF sub{not shift} |
262 | &NOT_DEF sub{not shift} | |
a4a197da RGS |
263 | FALSE sub{not shift} |
264 | [1] \&bar | |
265 | {a=>1} \&bar | |
266 | qr// \&bar | |
267 | ! [1] \&foo | |
268 | ! {a=>1} \&foo | |
41e726ac | 269 | $obj sub { ref($_[0]) =~ /NoOverload/ } |
90a32bcb | 270 | $ov_obj sub { ref($_[0]) =~ /WithOverload/ } |
a4a197da | 271 | # empty stuff matches, because the sub is never called: |
07edf497 RGS |
272 | [] \&foo |
273 | {} \&foo | |
031a44ed RGS |
274 | @empty \&foo |
275 | %empty \&foo | |
a4a197da RGS |
276 | ! qr// \&foo |
277 | ! undef \&foo | |
278 | undef \&bar | |
279 | @ undef \&fatal | |
280 | @ 1 \&fatal | |
281 | @ [1] \&fatal | |
203d1e89 | 282 | @ {a=>1} \&fatal |
a4a197da RGS |
283 | @ "foo" \&fatal |
284 | @ qr// \&fatal | |
203d1e89 | 285 | # sub is not called on empty hashes / arrays |
07edf497 RGS |
286 | [] \&fatal |
287 | +{} \&fatal | |
031a44ed RGS |
288 | @empty \&fatal |
289 | %empty \&fatal | |
532217f1 RGS |
290 | # sub is not special on the left |
291 | sub {0} qr/^CODE/ | |
292 | sub {0} sub { ref shift eq "CODE" } | |
0d863452 | 293 | |
0d863452 RH |
294 | # HASH ref against: |
295 | # - another hash ref | |
296 | {} {} | |
2a37c5e7 | 297 | =! {} {1 => 2} |
0d863452 RH |
298 | {1 => 2} {1 => 2} |
299 | {1 => 2} {1 => 3} | |
031a44ed RGS |
300 | =! {1 => 2} {2 => 3} |
301 | = \%main:: {map {$_ => 'x'} keys %main::} | |
0d863452 RH |
302 | |
303 | # - tied hash ref | |
2522c35a | 304 | = \%hash \%tied_hash |
0d863452 | 305 | \%tied_hash \%tied_hash |
031a44ed RGS |
306 | != {"a"=>"b"} \%tied_hash |
307 | = %hash %tied_hash | |
308 | %tied_hash %tied_hash | |
309 | != {"a"=>"b"} %tied_hash | |
c5836baf RGS |
310 | $ov_obj %refh MINISKIP |
311 | ! "$ov_obj" %refh MINISKIP | |
312 | [$ov_obj] %refh MINISKIP | |
313 | ! ["$ov_obj"] %refh MINISKIP | |
314 | %refh %refh MINISKIP | |
0d863452 RH |
315 | |
316 | # - an array ref | |
031a44ed RGS |
317 | # (since this is symmetrical, tests as well hash~~array) |
318 | = [keys %main::] \%:: | |
319 | = [qw[STDIN STDOUT]] \%:: | |
320 | =! [] \%:: | |
321 | =! [""] {} | |
322 | =! [] {} | |
323 | =! @empty {} | |
324 | = [undef] {"" => 1} | |
325 | = [""] {"" => 1} | |
326 | = ["foo"] { foo => 1 } | |
327 | = ["foo", "bar"] { foo => 1 } | |
328 | = ["foo", "bar"] \%hash | |
329 | = ["foo"] \%hash | |
330 | =! ["quux"] \%hash | |
331 | = [qw(foo quux)] \%hash | |
332 | = @fooormore { foo => 1, or => 2, more => 3 } | |
333 | = @fooormore %fooormore | |
334 | = @fooormore \%fooormore | |
335 | = \@fooormore %fooormore | |
0d863452 RH |
336 | |
337 | # - a regex | |
ea0c2dbd RGS |
338 | = qr/^(fo[ox])$/ {foo => 1} |
339 | = /^(fo[ox])$/ %fooormore | |
031a44ed | 340 | =! qr/[13579]$/ +{0..99} |
ea0c2dbd | 341 | =! qr/a*/ {} |
031a44ed | 342 | = qr/a*/ {b=>2} |
ea0c2dbd RGS |
343 | = qr/B/i {b=>2} |
344 | = /B/i {b=>2} | |
345 | =! qr/a+/ {b=>2} | |
346 | = qr/^à/ {"à"=>2} | |
0d863452 | 347 | |
031a44ed | 348 | # - a scalar |
2e0e16c9 | 349 | "foo" +{foo => 1, bar => 2} |
031a44ed | 350 | "foo" %fooormore |
2e0e16c9 | 351 | ! "baz" +{foo => 1, bar => 2} |
031a44ed RGS |
352 | ! "boz" %fooormore |
353 | ! 1 +{foo => 1, bar => 2} | |
354 | ! 1 %fooormore | |
355 | 1 { 1 => 3 } | |
356 | 1.0 { 1 => 3 } | |
357 | ! "1.0" { 1 => 3 } | |
358 | ! "1.0" { 1.0 => 3 } | |
359 | "1.0" { "1.0" => 3 } | |
360 | "à" { "à" => "À" } | |
0d863452 | 361 | |
61a621c6 | 362 | # - undef |
2522c35a | 363 | ! undef { hop => 'zouu' } |
61a621c6 RGS |
364 | ! undef %hash |
365 | ! undef +{"" => "empty key"} | |
2a37c5e7 | 366 | ! undef {} |
0d863452 RH |
367 | |
368 | # ARRAY ref against: | |
369 | # - another array ref | |
1cfb7049 | 370 | [] [] |
2522c35a | 371 | =! [] [1] |
ea0c2dbd RGS |
372 | [["foo"], ["bar"]] [qr/o/, qr/a/] |
373 | ! [["foo"], ["bar"]] [qr/ARRAY/, qr/ARRAY/] | |
0d863452 | 374 | ["foo", "bar"] [qr/o/, qr/a/] |
031a44ed | 375 | ! [qr/o/, qr/a/] ["foo", "bar"] |
2522c35a | 376 | ["foo", "bar"] [["foo"], ["bar"]] |
71b0fb34 | 377 | ! ["foo", "bar"] [qr/o/, "foo"] |
2522c35a | 378 | ["foo", undef, "bar"] [qr/o/, undef, "bar"] |
fb51372e | 379 | ! ["foo", undef, "bar"] [qr/o/, "", "bar"] |
2522c35a | 380 | ! ["foo", "", "bar"] [qr/o/, undef, "bar"] |
1cfb7049 | 381 | $deep1 $deep1 |
031a44ed | 382 | @$deep1 @$deep1 |
1cfb7049 | 383 | ! $deep1 $deep2 |
0d863452 | 384 | |
031a44ed RGS |
385 | = \@nums \@tied_nums |
386 | = @nums \@tied_nums | |
387 | = \@nums @tied_nums | |
388 | = @nums @tied_nums | |
389 | ||
d0b243e3 RGS |
390 | # - an object |
391 | ! $obj @fooormore | |
41e726ac | 392 | $obj [sub{ref shift}] |
d0b243e3 | 393 | |
0d863452 | 394 | # - a regex |
ea0c2dbd RGS |
395 | = qr/x/ [qw(foo bar baz quux)] |
396 | =! qr/y/ [qw(foo bar baz quux)] | |
397 | = /x/ [qw(foo bar baz quux)] | |
398 | =! /y/ [qw(foo bar baz quux)] | |
399 | = /FOO/i @fooormore | |
400 | =! /bar/ @fooormore | |
0d863452 RH |
401 | |
402 | # - a number | |
015eb7b9 | 403 | 2 [qw(1.00 2.00)] |
b0138e99 RGS |
404 | 2 [qw(foo 2)] |
405 | 2.0_0e+0 [qw(foo 2)] | |
406 | ! 2 [qw(1foo bar2)] | |
0d863452 RH |
407 | |
408 | # - a string | |
b0138e99 RGS |
409 | ! "2" [qw(1foo 2bar)] |
410 | "2bar" [qw(1foo 2bar)] | |
0d863452 | 411 | |
015eb7b9 RGS |
412 | # - undef |
413 | undef [1, 2, undef, 4] | |
414 | ! undef [1, 2, [undef], 4] | |
415 | ! undef @fooormore | |
416 | undef @sparse | |
fb51372e RGS |
417 | undef [undef] |
418 | ! 0 [undef] | |
419 | ! "" [undef] | |
420 | ! undef [0] | |
421 | ! undef [""] | |
015eb7b9 RGS |
422 | |
423 | # - nested arrays and ~~ distributivity | |
424 | 11 [[11]] | |
425 | ! 11 [[12]] | |
426 | "foo" [{foo => "bar"}] | |
427 | ! "bar" [{foo => "bar"}] | |
428 | ||
0d863452 RH |
429 | # Number against number |
430 | 2 2 | |
33ed63a2 | 431 | 20 2_0 |
0d863452 | 432 | ! 2 3 |
18d11902 RGS |
433 | 0 FALSE |
434 | 3-2 TRUE | |
fb51372e RGS |
435 | ! undef 0 |
436 | ! (my $u) 0 | |
0d863452 RH |
437 | |
438 | # Number against string | |
33ed63a2 RGS |
439 | = 2 "2" |
440 | = 2 "2.0" | |
0d863452 | 441 | ! 2 "2bananas" |
289d21b2 | 442 | != 2_3 "2_3" NOWARNINGS |
18d11902 | 443 | FALSE "0" |
fb51372e RGS |
444 | ! undef "0" |
445 | ! undef "" | |
0d863452 RH |
446 | |
447 | # Regex against string | |
a566f585 RGS |
448 | "x" qr/x/ |
449 | ! "x" qr/y/ | |
0d863452 RH |
450 | |
451 | # Regex against number | |
452 | 12345 qr/3/ | |
2522c35a | 453 | ! 12345 qr/7/ |
0d863452 | 454 | |
031a44ed | 455 | # array/hash against string |
d444f7e3 RGS |
456 | @fooormore "".\@fooormore |
457 | ! @keyandmore "".\@fooormore | |
458 | %fooormore "".\%fooormore | |
459 | ! %keyandmore "".\%fooormore | |
f1bef09e | 460 | |
0d863452 | 461 | # Test the implicit referencing |
b0138e99 | 462 | 7 @nums |
0d863452 RH |
463 | @nums \@nums |
464 | ! @nums \\@nums | |
465 | @nums [1..10] | |
466 | ! @nums [0..9] | |
467 | ||
2e0e16c9 RGS |
468 | "foo" %hash |
469 | /bar/ %hash | |
470 | [qw(bar)] %hash | |
471 | ! [qw(a b c)] %hash | |
71b0fb34 | 472 | %hash %hash |
fceebc47 | 473 | %hash +{%hash} |
73aec0b1 | 474 | %hash \%hash |
71b0fb34 DK |
475 | %hash %tied_hash |
476 | %tied_hash %tied_hash | |
477 | %hash { foo => 5, bar => 10 } | |
478 | ! %hash { foo => 5, bar => 10, quux => 15 } | |
479 | ||
480 | @nums { 1, '', 2, '' } | |
481 | @nums { 1, '', 12, '' } | |
482 | ! @nums { 11, '', 12, '' } | |
be99ef1a | 483 | |
329a333e DL |
484 | # array slices |
485 | @nums[0..-1] [] | |
486 | @nums[0..0] [1] | |
487 | ! @nums[0..1] [0..2] | |
488 | @nums[0..4] [1..5] | |
489 | ||
490 | ! undef @nums[0..-1] | |
491 | 1 @nums[0..0] | |
492 | 2 @nums[0..1] | |
493 | ! @nums[0..1] 2 | |
494 | ||
495 | @nums[0..1] @nums[0..1] | |
496 | ||
497 | # hash slices | |
498 | @keyandmore{qw(not)} [undef] | |
499 | @keyandmore{qw(key)} [0] | |
500 | ||
501 | undef @keyandmore{qw(not)} | |
502 | 0 @keyandmore{qw(key and more)} | |
503 | ! 2 @keyandmore{qw(key and)} | |
504 | ||
505 | @fooormore{qw(foo)} @keyandmore{qw(key)} | |
506 | @fooormore{qw(foo or more)} @keyandmore{qw(key and more)} | |
507 | ||
be99ef1a YK |
508 | # UNDEF |
509 | ! 3 undef | |
510 | ! 1 undef | |
511 | ! [] undef | |
512 | ! {} undef | |
513 | ! \%::main undef | |
514 | ! [1,2] undef | |
515 | ! %hash undef | |
516 | ! @nums undef | |
517 | ! "foo" undef | |
518 | ! "" undef | |
519 | ! !1 undef | |
520 | ! \&foo undef | |
521 | ! sub { } undef |