#!/usr/bin/perl
# Idiom #267 Pass string to argument that can be of any type
use v5. 28;
use Scalar
:: Util qw ( looks_like_number
) ;
# simplistic implementation but likely covers 98% of what you'd need
sub foo {
my ( $s , $x ) = @_ ;
return 'is a number' if looks_like_number
$s ; }
# comprehensive implementation that tests for all perl datatypes
sub whatis {
my ( $s , $x ) = @_ ;
my @list ;
push @list , ' is an ARRAY ref' if $r eq 'ARRAY' ; push @list , ' is a HASH ref' if $r eq 'HASH' ; push @list , ' is a CODE ref' if $r eq 'CODE' ; push @list , ' is a FORMAT ref' if $r eq 'FORMAT' ; push @list , ' is a IO ref' if $r eq 'IO' ;
my $m = ' is a SCALAR that' ;
push @list , ' looks like a number' if looks_like_number( $x ) ;
push @list , ' is a SCALAR ref' if $r eq 'SCALAR' ; push @list , ' is a REF' if $r eq 'REF' ; push @list , ' is a VSTRING' if $r eq 'VSTRING' ; push @list , ' is a GLOB ref' if $r eq 'GLOB' ; push @list , ' is a LVALUE' if $r eq 'LVALUE' ; push @list , ' is a REGEXP' if $r eq 'REGEXP' ; push @list , ' is a Regexp' if $r eq 'Regexp' ;
push @list , ' is a ' . $r if $r ne '' and not @list ;
push @list , ' is likely a string (ref=' . $r . ')' unless @list ;
}
Test: @<<<<<<<< @||||| @>>>>>
.
my $str ;
use IO:: File ;
my $io = IO:: File -> new ( ) ;
my $vs = v1. 23. 456;
my $vs_ref = \$vs ;
my $my_obj = { } ;
bless $my_obj , 'MyClass' ;
my @tests = (
[ 'Hello World' , 'Hello World' ] ,
[ "'abc'" , 'string' ] ,
[ '42' , 42 ] ,
[ '[]' , [ ] ] ,
[ "\\ 'ref'" , \'ref' ] ,
[ "\\ \\ 'refref'" , \\'refref' ] ,
[ 'sub {}' , sub { } , ] ,
[ '*fmt{FORMAT}' , *fmt { FORMAT} ] ,
[ '/^http:/' , qr/^http:/ ] ,
[ '$fh' , $fh ] ,
[ '\*STDIN' , \* STDIN ] ,
[ '\substr($str,0,1))' , $lv ] ,
[ 'v1.23.456' , $vs_ref ] ,
[ '\$io' , \$io ] ,
[ '$io_ref' , $io ] ,
[ '$my_obj' , $my_obj ] ,
) ;
say "### simplistic tests ###\n " ;
foreach my $t ( @tests ) {
my ( $s , $x ) = @$t ;
printf "%-25s %s\n " , $s , foo
( $s , $x ) ; }
say "\n ### comprehensive tests ###\n " ;
foreach my $t ( @tests ) {
my ( $s , $x ) = @$t ;
say whatis( $s , $x ) ;
}
IyEvdXNyL2Jpbi9wZXJsCgojIElkaW9tICMyNjcgUGFzcyBzdHJpbmcgdG8gYXJndW1lbnQgdGhhdCBjYW4gYmUgb2YgYW55IHR5cGUKCnVzZSB2NS4yODsKCnVzZSBTY2FsYXI6OlV0aWwgcXcobG9va3NfbGlrZV9udW1iZXIpOwoKIyBzaW1wbGlzdGljIGltcGxlbWVudGF0aW9uIGJ1dCBsaWtlbHkgY292ZXJzIDk4JSBvZiB3aGF0IHlvdSdkIG5lZWQKc3ViIGZvbyB7CiAgICBteSAoJHMsICR4KSA9IEBfOwogICAgcmV0dXJuICdpcyB1bmRlZmluZWQnICAgaWYgbm90IGRlZmluZWQgJHg7CiAgICByZXR1cm4gJ2lzIGEgcmVmZXJlbmNlJyBpZiByZWYgJHggbmUgJyc7CiAgICByZXR1cm4gJ2lzIGEgbnVtYmVyJyAgICBpZiBsb29rc19saWtlX251bWJlciAkczsKICAgIHJldHVybiAnaXMgYSBzdHJpbmcnOwp9CgojIGNvbXByZWhlbnNpdmUgaW1wbGVtZW50YXRpb24gdGhhdCB0ZXN0cyBmb3IgYWxsIHBlcmwgZGF0YXR5cGVzCnN1YiB3aGF0aXMgewogICAgbXkgKCRzLCAkeCkgPSBAXzsKICAgIG15ICRyID0gcmVmICR4OwogICAgbXkgQGxpc3Q7CiAgICBwdXNoIEBsaXN0LCAnIGlzIHVuZGVmaW5lZCcgaWYgbm90IGRlZmluZWQgJHg7CiAgICBwdXNoIEBsaXN0LCAnIGlzIGFuIEFSUkFZIHJlZicgIGlmICRyIGVxICdBUlJBWSc7CiAgICBwdXNoIEBsaXN0LCAnIGlzIGEgSEFTSCByZWYnICAgIGlmICRyIGVxICdIQVNIJzsKICAgIHB1c2ggQGxpc3QsICcgaXMgYSBDT0RFIHJlZicgICAgaWYgJHIgZXEgJ0NPREUnOwogICAgcHVzaCBAbGlzdCwgJyBpcyBhIEZPUk1BVCByZWYnICBpZiAkciBlcSAnRk9STUFUJzsKICAgIHB1c2ggQGxpc3QsICcgaXMgYSBJTyByZWYnICAgICAgaWYgJHIgZXEgJ0lPJzsKICAgIAogICAgbXkgJG0gPSAnIGlzIGEgU0NBTEFSIHRoYXQnOwogICAgCiAgICBwdXNoIEBsaXN0LCAnIGxvb2tzIGxpa2UgYSBudW1iZXInIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbG9va3NfbGlrZV9udW1iZXIoJHgpOwogIAogICAgcHVzaCBAbGlzdCwgJyBpcyBhIFNDQUxBUiByZWYnIGlmICRyIGVxICdTQ0FMQVInOwogICAgcHVzaCBAbGlzdCwgJyBpcyBhIFJFRicgICAgICAgIGlmICRyIGVxICdSRUYnOwogICAgcHVzaCBAbGlzdCwgJyBpcyBhIFZTVFJJTkcnICAgIGlmICRyIGVxICdWU1RSSU5HJzsKICAgIHB1c2ggQGxpc3QsICcgaXMgYSBHTE9CIHJlZicgICBpZiAkciBlcSAnR0xPQic7CiAgICBwdXNoIEBsaXN0LCAnIGlzIGEgTFZBTFVFJyAgICAgaWYgJHIgZXEgJ0xWQUxVRSc7CiAgICBwdXNoIEBsaXN0LCAnIGlzIGEgUkVHRVhQJyAgICAgaWYgJHIgZXEgJ1JFR0VYUCc7CiAgICBwdXNoIEBsaXN0LCAnIGlzIGEgUmVnZXhwJyAgICAgaWYgJHIgZXEgJ1JlZ2V4cCc7CiAgICAKICAgIHB1c2ggQGxpc3QsICcgaXMgYSAnIC4gJHIgICAgICBpZiAkciBuZSAnJyBhbmQgbm90IEBsaXN0OwoKICAgIHB1c2ggQGxpc3QsICcgaXMgbGlrZWx5IGEgc3RyaW5nIChyZWY9JyAuICRyIC4gJyknCiAgICAgICAgdW5sZXNzIEBsaXN0OwogICAKICAgIHJldHVybiBzcHJpbnRmIHFxKCUtMjVzICAgJXMpLCAkcywgam9pbiAnLCAiJywgQGxpc3Q7Cn0KCmZvcm1hdCBmbXQgPQogICBUZXN0OiBAPDw8PDw8PDwgQHx8fHx8IEA+Pj4+PgouCgpteSAkc3RyOwpvcGVuIG15ICRmaCwgJzwnLCBcJHN0cjsKCnVzZSBJTzo6RmlsZTsKbXkgJGlvID0gSU86OkZpbGUtPm5ldygpOwoKbXkgJGx2ID0gXCBzdWJzdHIgJHN0ciwgMCwgMjsKbXkgJHZzID0gdjEuMjMuNDU2OwpteSAkdnNfcmVmID0gXCR2czsKbXkgJG15X29iaiA9IHt9OwpibGVzcyAkbXlfb2JqLCAnTXlDbGFzcyc7CgpteSBAdGVzdHMgPSAoCiAgICBbICd1bmRlZicgICAgICAgICAgICAgICAgLCB1bmRlZiAgICAgICAgIF0sCiAgICBbICdIZWxsbyBXb3JsZCcgICAgICAgICAgLCAnSGVsbG8gV29ybGQnIF0sCiAgICBbICInYWJjJyIgICAgICAgICAgICAgICAgLCAnc3RyaW5nJyAgICAgIF0sCiAgICBbICc0MicgICAgICAgICAgICAgICAgICAgLCA0MiAgICAgICAgICAgIF0sCiAgICBbICdbXScgICAgICAgICAgICAgICAgICAgLCBbXSAgICAgICAgICAgIF0sCiAgICBbICJcXCdyZWYnIiAgICAgICAgICAgICAgLCBcJ3JlZicgICAgICAgIF0sCiAgICBbICJcXFxcJ3JlZnJlZiciICAgICAgICAgLCBcXCdyZWZyZWYnICAgIF0sCiAgICBbICdzdWIge30nICAgICAgICAgICAgICAgLCBzdWIge30sICAgICAgIF0sCiAgICBbICcqZm10e0ZPUk1BVH0nICAgICAgICAgLCAqZm10e0ZPUk1BVH0gIF0sCiAgICBbICcvXmh0dHA6LycgICAgICAgICAgICAgLCBxci9eaHR0cDovICAgIF0sCiAgICBbICckZmgnICAgICAgICAgICAgICAgICAgLCAkZmggICAgICAgICAgIF0sCiAgICBbICdcKlNURElOJyAgICAgICAgICAgICAgLCBcKlNURElOICAgICAgIF0sCiAgICBbICdcc3Vic3RyKCRzdHIsMCwxKSknICAgLCAkbHYgICAgICAgICAgIF0sCiAgICBbICd2MS4yMy40NTYnICAgICAgICAgICAgLCAkdnNfcmVmICAgICAgIF0sCiAgICBbICdcJGlvJyAgICAgICAgICAgICAgICAgLCBcJGlvICAgICAgICAgIF0sCiAgICBbICckaW9fcmVmJyAgICAgICAgICAgICAgLCAkaW8gICAgICAgICAgIF0sCiAgICBbICckbXlfb2JqJyAgICAgICAgICAgICAgLCAkbXlfb2JqICAgICAgIF0sCik7CgpzYXkgIiMjIyBzaW1wbGlzdGljIHRlc3RzICMjI1xuIjsKCmZvcmVhY2ggbXkgJHQgKEB0ZXN0cykgewogICAgbXkgKCRzLCAkeCkgPSBAJHQ7CiAgICBwcmludGYgIiUtMjVzICAgICVzXG4iLCAkcywgZm9vKCRzLCAkeCk7Cn0KCnNheSAiXG4jIyMgY29tcHJlaGVuc2l2ZSB0ZXN0cyAjIyNcbiI7Cgpmb3JlYWNoIG15ICR0IChAdGVzdHMpIHsKICAgIG15ICgkcywgJHgpID0gQCR0OwogICAgc2F5IHdoYXRpcygkcywgJHgpOwp9CgoKY2xvc2UgJGZoOwokaW8tPmNsb3NlOwo=