.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.40) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left .\" double quote, and \*(R" will give a right double quote. \*(C+ will .\" give a nicer C++. Capital omega is used to do unbreakable dashes and .\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, .\" nothing in troff, for use with C<>. .tr \(*W- .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` "" . ds C' "" 'br\} .el\{\ . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' . ds C` . ds C' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is >0, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .nr rF 0 .if \n(.g .if rF .nr rF 1 .if (\n(rF:(\n(.g==0)) \{\ . if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{\ . nr % 0 . nr F 2 . \} . \} .\} .rr rF .\" .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). .\" Fear. Run. Save yourself. No user-serviceable parts. . \" fudge factors for nroff and troff .if n \{\ . ds #H 0 . ds #V .8m . ds #F .3m . ds #[ \f1 . ds #] \fP .\} .if t \{\ . ds #H ((1u-(\\\\n(.fu%2u))*.13m) . ds #V .6m . ds #F 0 . ds #[ \& . ds #] \& .\} . \" simple accents for nroff and troff .if n \{\ . ds ' \& . ds ` \& . ds ^ \& . ds , \& . ds ~ ~ . ds / .\} .if t \{\ . ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" . ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' . ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' . ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' . ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' . ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' .\} . \" troff and (daisy-wheel) nroff accents .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' .ds 8 \h'\*(#H'\(*b\h'-\*(#H' .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] .ds ae a\h'-(\w'a'u*4/10)'e .ds Ae A\h'-(\w'A'u*4/10)'E . \" corrections for vroff .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' . \" for low resolution devices (crt and lpr) .if \n(.H>23 .if \n(.V>19 \ \{\ . ds : e . ds 8 ss . ds o a . ds d- d\h'-1'\(ga . ds D- D\h'-1'\(hy . ds th \o'bp' . ds Th \o'LP' . ds ae ae . ds Ae AE .\} .rm #[ #] #H #V #F C .\" ======================================================================== .\" .IX Title "Syntax::Keyword::Dynamically 3pm" .TH Syntax::Keyword::Dynamically 3pm "2021-02-04" "perl v5.32.1" "User Contributed Perl Documentation" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "NAME" "Syntax::Keyword::Dynamically" \- dynamically change the value of a variable .SH "SYNOPSIS" .IX Header "SYNOPSIS" .Vb 1 \& use Syntax::Keyword::Dynamically; \& \& my $logger = ...; \& \& sub operate \& { \& dynamically $logger\->level = LOG_DEBUG; \& \& do_things(); \& } .Ve .SH "DESCRIPTION" .IX Header "DESCRIPTION" This module provides a syntax plugin that implements a single keyword, \&\f(CW\*(C`dynamically\*(C'\fR, which alters the behaviour of a scalar assignment operation. Syntactically and semantically it is similar to the built-in perl keyword \&\f(CW\*(C`local\*(C'\fR, but is implemented somewhat differently to give two key advantages over regular \f(CW\*(C`local\*(C'\fR: .IP "\(bu" 2 You can \f(CW\*(C`dynamically\*(C'\fR assign to lvalue functions and accessors. .IP "\(bu" 2 You can \f(CW\*(C`dynamically\*(C'\fR assign to regular lexical variables. .PP Semantically, the behaviour can be considered equivalent to .PP .Vb 3 \& { \& my $old = $VAR; \& $VAR = "new value"; \& \& ... \& \& $VAR = $old; \& } .Ve .PP Except that the old value will also be restored in the case of exceptions, \&\f(CW\*(C`goto\*(C'\fR, \f(CW\*(C`next/last/redo\*(C'\fR or similar ways to leave the controlling block scope. .SH "KEYWORDS" .IX Header "KEYWORDS" .SS "dynamically" .IX Subsection "dynamically" .Vb 4 \& { \& dynamically LVALUE = EXPR; \& ... \& } .Ve .PP The \f(CW\*(C`dynamically\*(C'\fR keyword modifies the behaviour of the following expression. which must be a scalar assignment. Before the new value is assigned to the lvalue, its current value is captured and stored internally within the Perl interpreter. When execution leaves the controlling block for whatever reason, as part of block scope cleanup the saved value is restored. .PP The \s-1LVALUE\s0 may be any kind of expression that allows normal scalar assignment; lexical or package scalar variables, elements of arrays or hashes, or the result of calling an \f(CW\*(C`:lvalue\*(C'\fR function or method. .PP If the \s-1LVALUE\s0 has any \s-1GET\s0 magic associated with it (including a \f(CW\*(C`FETCH\*(C'\fR method of a tied scalar) then this will be executed exactly once when the \&\f(CW\*(C`dynamically\*(C'\fR expression is evaluated. .PP If the \s-1LVALUE\s0 has any \s-1SET\s0 magic associated with it (including a \f(CW\*(C`STORE\*(C'\fR method of a tied scalar) then this will be executed exactly once when the \&\f(CW\*(C`dynamically\*(C'\fR expression is evaluated, and again a second time when the controlling scope is unwound. .PP When the \s-1LVALUE\s0 being assigned to is a hash element, e.g. one of the following forms .PP .Vb 2 \& dynamically $hash{key} = EXPR; \& dynamically $href\->{key} = EXPR; .Ve .PP the assignment additionally ensures to remove the key if it is newly-added, and restores by adding the key back again if it had been deleted in the meantime. .SH "WITH Future::AsyncAwait" .IX Header "WITH Future::AsyncAwait" As of Future::AsyncAwait version 0.32, cross-module integration tests assert that the \f(CW\*(C`dynamically\*(C'\fR correctly works across an \f(CW\*(C`await\*(C'\fR boundary. .PP .Vb 2 \& use Future::AsyncAwait; \& use Syntax::Keyword::Dynamically; \& \& our $var; \& \& async sub trial \& { \& dynamically $var = "value"; \& \& await func(); \& \& say "Var is still $var"; \& } .Ve .PP When context-switching between scopes in which a variable is \f(CW\*(C`dynamically\*(C'\fR modified, the value of the variable will be swapped in and out, possibly multiple times if necessary, to ensure the visible value remains as expected. .SH "AUTHOR" .IX Header "AUTHOR" Paul Evans