Advertisement
DRVTiny

get_nested_struct_val.pl

Nov 19th, 2018
297
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 1.46 KB | None | 0 0
  1. #!/usr/bin/perl
  2. use 5.16.1;
  3. use Data::Dumper;
  4. use constant DFLT_STRUCT_KEY_SEP => '\.';
  5.  
  6. sub is_plain_scalar { defined($_[0]) &&  !ref($_[0]) && length($_[0]) }
  7.  
  8. my $get_struct_val_r;
  9. $get_struct_val_rx = {
  10.     'ARRAY' => sub {
  11. #        print Dumper {'ARRAY'=>\@_};
  12.         my $i = shift $_[1];
  13.         length($i) && $i =~ /^-?\d+$/;
  14.         $_[0] = $_[0][$i];
  15.         $#{$_[1]} >= 0
  16.             ? do {
  17.                 if (my $s = $get_struct_val_r->{ref $_[0]}) {
  18.                     &$s
  19.                 } else {
  20.                     undef
  21.                 }
  22.               }
  23.             : $_[0]
  24.     },
  25.     'HASH' => sub {
  26. #        print Dumper {'HASH'=>\@_};
  27.         $_[0] = $_[0]{shift $_[1]};
  28.         $#{$_[1]} >= 0
  29.             ? do {
  30.                 if (my $s = $get_struct_val_r->{ref $_[0]}) {
  31.                     &$s
  32.                 } else {
  33.                     undef
  34.                 }
  35.               }
  36.             : $_[0]
  37.     }
  38. };
  39.  
  40. sub get_struct_val {
  41.     (my $refType = ref(my $struct = shift)) or return;
  42.     my $pth = $_[0];
  43.     is_plain_scalar($pth) or return;
  44.     my $rxSep = is_plain_scalar($_[1]) ? $_[1] : DFLT_STRUCT_KEY_SEP;
  45.     ($get_struct_val_r->{$refType} // sub { return })->($struct, [split qr($rxSep), $pth]);
  46. }
  47.  
  48. my $hr = {
  49.     'a' =>
  50.     [
  51.         {
  52.             'b' =>
  53.                 {
  54.                     'c' => [qw/d e f/]
  55.                 }
  56.         }
  57.     ]
  58. };
  59.  
  60. print Dumper [ get_struct_val($hr, 'a.0.b.c.2') ];
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement