Guest User

Untitled

a guest
Jun 21st, 2018
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.30 KB | None | 0 0
  1. #!/usr/bin/perl
  2.  
  3. use strict;
  4. use warnings;
  5.  
  6. my %orig;
  7. for my $name (qw/foo bar baz/) {
  8. my $var = ${$meta::{$name}};
  9. $orig{$name} = $$var;
  10. $$var = $$var * 2;
  11. }
  12. meta::p();
  13. for my $name (keys %orig) {
  14. my $var = ${$meta::{$name}};
  15. $$var = $orig{$name};
  16. }
  17. meta::p();
  18.  
  19. package meta;
  20.  
  21. BEGIN {
  22. our $foo = 1;
  23. our $bar = 2;
  24. our $baz = 3;
  25. }
  26.  
  27. sub p { print join(" :: ", $meta::foo, $meta::bar, $meta::baz), "n" }
  28.  
  29. my $eval = '';
  30.  
  31. for my $name (qw/foo bar baz/) {
  32. $eval .= "local $meta::$name = $meta::$name * 2;n";
  33. }
  34.  
  35. eval "$eval meta::p()";
  36. meta::p();
  37.  
  38. use strict;
  39. use warnings;
  40.  
  41. {
  42. no strict `refs`;
  43. local ${"meta::$name"} = ${"meta::$name"} * 2;
  44.  
  45. meta::p();
  46. }
  47.  
  48. meta::p();
  49.  
  50. # This works but does not work on an array of names.
  51. { no strict 'refs';
  52.  
  53. local ( ${'meta::foo'}, ${'meta::bar'}, ${'meta::baz'} );
  54. meta::p();
  55. }
  56. meta::p();
  57.  
  58.  
  59. # THIS DOES NOT WORK AT ALL!
  60. { no strict 'refs';
  61.  
  62. my @to_localize = map "meta::$_", qw/foo bar baz/;
  63.  
  64. local ${$_} = $$_ * 2 for @to_localize;
  65. meta::p();
  66.  
  67. }
  68. meta::p();
  69.  
  70. { no strict 'refs';
  71.  
  72. my @to_localize = map "meta::$_", qw/foo bar baz/;
  73.  
  74. LOCALIZER:
  75. my $localize_me = shift @to_localize;
  76. local ${$localize_me} = $$localize_me * 2;
  77. goto LOCALIZER if @to_localize;
  78.  
  79. meta::p();
  80.  
  81. }
  82. meta::p();
Add Comment
Please, Sign In to add comment