File Coverage

blib/lib/String/Interpolate/Named.pm
Criterion Covered Total %
statement 120 123 97.5
branch 47 52 90.3
condition 26 32 81.2
subroutine 15 15 100.0
pod 3 7 42.8
total 211 229 92.1


line stmt bran cond sub pod time code
1             #! perl
2              
3             package String::Interpolate::Named;
4              
5 8     8   2945322 use warnings;
  8         18  
  8         782  
6 8     8   84 use strict;
  8         17  
  8         348  
7 8     8   4675 use utf8;
  8         5822  
  8         52  
8 8     8   392 use Carp qw( carp croak );
  8         28  
  8         935  
9              
10             # Disable 'Unicode character 0xfddX is illegal' warnings.
11 8     8   61 no if $] < 5.014, q|warnings|, qw(utf8);
  8         19  
  8         394  
12              
13 8     8   553 use parent 'Exporter';
  8         359  
  8         74  
14             our @EXPORT = qw( interpolate );
15              
16             =head1 NAME
17              
18             String::Interpolate::Named - Interpolated named arguments in string
19              
20             =cut
21              
22             our $VERSION = '1.06';
23              
24             =head1 SYNOPSIS
25              
26             use String::Interpolate::Named;
27              
28             my $ctl = { args => { fn => "Johan", ln => "Bach" } };
29             say interpolate( $ctl, "The famous %{fn} %{ln}." );
30              
31             # If you like object orientation.
32             my $int = String::Interpolate::Named->new( { args => { ... } } );
33             say $int->interpolate("The famous %{fn} %{ln}.");
34              
35             =head1 DESCRIPTION
36              
37             String::Interpolate::Named provides a function to interpolate named
38             I by I in a template string. The target texts
39             are provided to the function via a hash, where the keys correspond to
40             the named argument to be replaced, or a subroutine that performs the
41             lookup.
42              
43             =head2 Named Arguments
44              
45             The arguments to be replaced are marked in the template by enclosing
46             them between C<%{> and C<}>. For example, the string C<"The famous
47             %{fn} %{ln}."> contains two named arguments, C and C.
48              
49             Note that the activator may be changed from C<%> into something else,
50             see below. Throughout this document we use the default value.
51              
52             =head2 Basic Interpolation
53              
54             When interpolated, the keys C and C are looked up in the hash,
55             and the corresponding values are substituted. If no value was found
56             for a named argument, nothing is substituted and the C<%{...}> is
57             removed.
58              
59             You can precede C<%>, C<{>, C<}> (and C<|>, see below) with a
60             backslash C<\> to hide their special meanings. For example, C<\}> will
61             I be considered closing an argument but yield a plain C<}> in the
62             text.
63              
64             =head2 Conditional Interpolation
65              
66             It is possible to select replacement values depending on whether
67             the named argument has a value or not:
68              
69             "This book has %{title|title %{title}}"
70             "This book has %{title|title %{title}|no title}"
71              
72             These are considered C<%{if|then}> and C<%{if|then|else}> cases.
73              
74             Assuming argument C has the value C<"My Book">, in the first </td> </tr> <tr> <td class="h" > <a name="75">75</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> example the text C<"title My Book">, the 'then' text, will be </td> </tr> <tr> <td class="h" > <a name="76">76</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> substituted, resulting in </td> </tr> <tr> <td class="h" > <a name="77">77</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="78">78</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> "This book has title My Title" </td> </tr> <tr> <td class="h" > <a name="79">79</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="80">80</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> If C<title> does not have a value, the empty string is substituted. In </td> </tr> <tr> <td class="h" > <a name="81">81</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> the second example, the string C<"no title">, the 'else' text, will be </td> </tr> <tr> <td class="h" > <a name="82">82</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> substituted. </td> </tr> <tr> <td class="h" > <a name="83">83</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="84">84</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> As can be seen, the replacement texts may contain interpolations as </td> </tr> <tr> <td class="h" > <a name="85">85</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> well. For convenience, you can use C<%{}> to refer to the value of the </td> </tr> <tr> <td class="h" > <a name="86">86</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> named argument currently being examinated. The last example above can </td> </tr> <tr> <td class="h" > <a name="87">87</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> be written more shortly and elegantly as: </td> </tr> <tr> <td class="h" > <a name="88">88</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="89">89</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> "This book has %{title|title %{}|no title}" </td> </tr> <tr> <td class="h" > <a name="90">90</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="91">91</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head2 Testing Values </td> </tr> <tr> <td class="h" > <a name="92">92</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="93">93</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Instead of testing for named variables to have a value, you can also </td> </tr> <tr> <td class="h" > <a name="94">94</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> test for specific values: </td> </tr> <tr> <td class="h" > <a name="95">95</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="96">96</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> "This takes %{days=1|%{} day|%{} days}" </td> </tr> <tr> <td class="h" > <a name="97">97</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="98">98</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head2 List Values </td> </tr> <tr> <td class="h" > <a name="99">99</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="100">100</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> The replacement values hash may be scalar (in general: strings and </td> </tr> <tr> <td class="h" > <a name="101">101</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> numbers) or lists of scalars. If a value is a list of scalars, it is </td> </tr> <tr> <td class="h" > <a name="102">102</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> possible to select a particular value from the list by appending an </td> </tr> <tr> <td class="h" > <a name="103">103</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> index (period and a number) to the named argument. </td> </tr> <tr> <td class="h" > <a name="104">104</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="105">105</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Assume C<customer> has value C<[ "Jones", "Smith" ]>, then: </td> </tr> <tr> <td class="h" > <a name="106">106</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="107">107</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> "%{customer} will be Jones Smith" </td> </tr> <tr> <td class="h" > <a name="108">108</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> "%{customer.0} will be Jones Smith" </td> </tr> <tr> <td class="h" > <a name="109">109</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> "%{customer.1} will be Jones" </td> </tr> <tr> <td class="h" > <a name="110">110</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> "%{customer.2} will be Smith" </td> </tr> <tr> <td class="h" > <a name="111">111</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="112">112</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> When the value exceeds the number of elements in the list, an empty </td> </tr> <tr> <td class="h" > <a name="113">113</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> value is returned. </td> </tr> <tr> <td class="h" > <a name="114">114</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Index zero, or no index, will return all values concatenated. </td> </tr> <tr> <td class="h" > <a name="115">115</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="116">116</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head2 Format modifiers </td> </tr> <tr> <td class="h" > <a name="117">117</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="118">118</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> A named variable may have I<format modifiers> attached to perform </td> </tr> <tr> <td class="h" > <a name="119">119</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> formatting operations on the substituted value. </td> </tr> <tr> <td class="h" > <a name="120">120</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Format modifiers start with a colon C<:>. </td> </tr> <tr> <td class="h" > <a name="121">121</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="122">122</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Assuming argument C<title> has the value C<"My Book">, then </td> </tr> <tr> <td class="h" > <a name="123">123</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> C<"%{title:lc}"> </td> </tr> <tr> <td class="h" > <a name="124">124</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> will yield the title in lowercase C<"my book">. </td> </tr> <tr> <td class="h" > <a name="125">125</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="126">126</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> The following format modifiers are available: </td> </tr> <tr> <td class="h" > <a name="127">127</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="128">128</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =over 6 </td> </tr> <tr> <td class="h" > <a name="129">129</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="130">130</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item C<:lc> </td> </tr> <tr> <td class="h" > <a name="131">131</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="132">132</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Yields the substituted value in all lower case. </td> </tr> <tr> <td class="h" > <a name="133">133</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="134">134</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Using the example above, this will be C<"my book">. </td> </tr> <tr> <td class="h" > <a name="135">135</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="136">136</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item C<:uc> </td> </tr> <tr> <td class="h" > <a name="137">137</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="138">138</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Yields the substituted value in all upper case. </td> </tr> <tr> <td class="h" > <a name="139">139</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="140">140</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Using the example above, this will be C<"MY BOOK">. </td> </tr> <tr> <td class="h" > <a name="141">141</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="142">142</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item C<:ic> </td> </tr> <tr> <td class="h" > <a name="143">143</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="144">144</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Yields the substituted value with initial caps, e.g. the first letter </td> </tr> <tr> <td class="h" > <a name="145">145</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> of each word is capitalized. </td> </tr> <tr> <td class="h" > <a name="146">146</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="147">147</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Using the example above, this will be C<"My Book">. </td> </tr> <tr> <td class="h" > <a name="148">148</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Indeed, no difference since the value is already correctly cased. </td> </tr> <tr> <td class="h" > <a name="149">149</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="150">150</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> To enforce lower case before applying initial case, use format modifiers </td> </tr> <tr> <td class="h" > <a name="151">151</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> C<:lc:ic>. </td> </tr> <tr> <td class="h" > <a name="152">152</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="153">153</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item C<:sc> </td> </tr> <tr> <td class="h" > <a name="154">154</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="155">155</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Yields the substituted value with an initial cap and the rest lower case. </td> </tr> <tr> <td class="h" > <a name="156">156</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="157">157</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Using the example above, this will be C<"My Book">. </td> </tr> <tr> <td class="h" > <a name="158">158</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Again, no difference since the value already has an initial capital. </td> </tr> <tr> <td class="h" > <a name="159">159</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="160">160</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> To enforce lower case before applying initial case, use format modifiers </td> </tr> <tr> <td class="h" > <a name="161">161</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> C<:lc:sc>. Now the result will be C<"My book">. </td> </tr> <tr> <td class="h" > <a name="162">162</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="163">163</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item C<:lpad(>I<N>C<)> C<:lpad(>I<N>C<,>I<S>C<)> </td> </tr> <tr> <td class="h" > <a name="164">164</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="165">165</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Pads the value by repeatedly prepending the string I<S> until the </td> </tr> <tr> <td class="h" > <a name="166">166</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> total width is I<N>. </td> </tr> <tr> <td class="h" > <a name="167">167</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="168">168</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> If I<S> is omitted, uses spaces. </td> </tr> <tr> <td class="h" > <a name="169">169</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="170">170</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item C<:rpad(>I<N>C<)> C<:rpad(>I<N>C<,>I<S>C<)> </td> </tr> <tr> <td class="h" > <a name="171">171</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="172">172</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Pads the value by repeatedly appending the string I<S> until the </td> </tr> <tr> <td class="h" > <a name="173">173</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> total width is I<N>. </td> </tr> <tr> <td class="h" > <a name="174">174</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="175">175</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> If I<S> is omitted, uses spaces. </td> </tr> <tr> <td class="h" > <a name="176">176</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="177">177</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item C<:replace(>I<SRC>C<,>I<DST>C<)> </td> </tr> <tr> <td class="h" > <a name="178">178</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="179">179</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Replaces all occurrences of I<STR> by I<DST>, </td> </tr> <tr> <td class="h" > <a name="180">180</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="181">181</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> If I<S> is omitted, uses spaces. </td> </tr> <tr> <td class="h" > <a name="182">182</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="183">183</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item C<:%>I<fmt> </td> </tr> <tr> <td class="h" > <a name="184">184</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="185">185</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Apply standard printf() formatting, e.g. C<%{key:%03d}> yields the numeric </td> </tr> <tr> <td class="h" > <a name="186">186</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> value of C<key> as a 3-digit string, adding leading zeroes if necessary. </td> </tr> <tr> <td class="h" > <a name="187">187</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="188">188</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =back </td> </tr> <tr> <td class="h" > <a name="189">189</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="190">190</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Note that, when combining formatting and conditional interpolation, </td> </tr> <tr> <td class="h" > <a name="191">191</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> you must check for the I<formatted> value: </td> </tr> <tr> <td class="h" > <a name="192">192</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="193">193</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> "This takes %{days:%02d=01|%{} day|%{} days}" </td> </tr> <tr> <td class="h" > <a name="194">194</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="195">195</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> You can prevent a colon from splitting formatters with a backslash: </td> </tr> <tr> <td class="h" > <a name="196">196</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="197">197</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> %{title:replace( ,\:)} </td> </tr> <tr> <td class="h" > <a name="198">198</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="199">199</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head2 The Control Hash </td> </tr> <tr> <td class="h" > <a name="200">200</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="201">201</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> The interpolation process requires two parameters: a hash with </td> </tr> <tr> <td class="h" > <a name="202">202</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> settings and values for the named arguments, and the string to be used </td> </tr> <tr> <td class="h" > <a name="203">203</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> as a template for interpolation. The hash will be further referred to </td> </tr> <tr> <td class="h" > <a name="204">204</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> as the I<control hash>. </td> </tr> <tr> <td class="h" > <a name="205">205</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="206">206</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> The hash can have the following keys: </td> </tr> <tr> <td class="h" > <a name="207">207</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="208">208</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =over </td> </tr> <tr> <td class="h" > <a name="209">209</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="210">210</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item args </td> </tr> <tr> <td class="h" > <a name="211">211</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="212">212</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> This is either a hash that contains replacement texts for the named </td> </tr> <tr> <td class="h" > <a name="213">213</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> variables, or a subroutine that gets called with a variable as </td> </tr> <tr> <td class="h" > <a name="214">214</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> argument and returns a replacement value. </td> </tr> <tr> <td class="h" > <a name="215">215</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="216">216</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> This element should be considered mandatory. </td> </tr> <tr> <td class="h" > <a name="217">217</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="218">218</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item separator </td> </tr> <tr> <td class="h" > <a name="219">219</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="220">220</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> The separator used to concatenate list values, see L<List Values> above. </td> </tr> <tr> <td class="h" > <a name="221">221</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="222">222</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> It defaults to Perl variable C<$"> that, on its turn, defaults to a </td> </tr> <tr> <td class="h" > <a name="223">223</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> single space. </td> </tr> <tr> <td class="h" > <a name="224">224</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="225">225</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item activator </td> </tr> <tr> <td class="h" > <a name="226">226</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="227">227</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> This is a single character that activates interpolation. By default </td> </tr> <tr> <td class="h" > <a name="228">228</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> this is the percent C<%> character. </td> </tr> <tr> <td class="h" > <a name="229">229</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="230">230</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item keypattern </td> </tr> <tr> <td class="h" > <a name="231">231</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="232">232</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> The pattern to match key names. Default is C<qr/\w+[-_\w.]*/>. </td> </tr> <tr> <td class="h" > <a name="233">233</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="234">234</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =item maxiter </td> </tr> <tr> <td class="h" > <a name="235">235</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="236">236</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> To enable nested substitutions and recursive replacement, the </td> </tr> <tr> <td class="h" > <a name="237">237</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> interpolation process is repeated until there are no more </td> </tr> <tr> <td class="h" > <a name="238">238</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> interpolations to be made. The maximun number of iterations is limited </td> </tr> <tr> <td class="h" > <a name="239">239</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> to the value of C<maxiter>. </td> </tr> <tr> <td class="h" > <a name="240">240</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="241">241</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> By default maxiter is 16. </td> </tr> <tr> <td class="h" > <a name="242">242</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="243">243</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =back </td> </tr> <tr> <td class="h" > <a name="244">244</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="245">245</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> An example of a control hash: </td> </tr> <tr> <td class="h" > <a name="246">246</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="247">247</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my %ctl = </td> </tr> <tr> <td class="h" > <a name="248">248</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> ( args => { </td> </tr> <tr> <td class="h" > <a name="249">249</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> customer => [ "Jones", "Smith" ], </td> </tr> <tr> <td class="h" > <a name="250">250</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> days => 2, </td> </tr> <tr> <td class="h" > <a name="251">251</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> title => "My Title", </td> </tr> <tr> <td class="h" > <a name="252">252</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> }, </td> </tr> <tr> <td class="h" > <a name="253">253</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> separator => ", ", </td> </tr> <tr> <td class="h" > <a name="254">254</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> ); </td> </tr> <tr> <td class="h" > <a name="255">255</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="256">256</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head2 Object Oriented API </td> </tr> <tr> <td class="h" > <a name="257">257</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="258">258</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my $ii = String::Interpolate::Named->new; </td> </tr> <tr> <td class="h" > <a name="259">259</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> $ii->ctl(\%ctl); </td> </tr> <tr> <td class="h" > <a name="260">260</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> $result = $ii->interpolate($template); </td> </tr> <tr> <td class="h" > <a name="261">261</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="262">262</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> For convenience, the control hash may be passed to the constructor: </td> </tr> <tr> <td class="h" > <a name="263">263</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="264">264</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my $ii = String::Interpolate::Named->new(\%ctl); </td> </tr> <tr> <td class="h" > <a name="265">265</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> $result = $ii->interpolate($template); </td> </tr> <tr> <td class="h" > <a name="266">266</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="267">267</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head2 Functional API </td> </tr> <tr> <td class="h" > <a name="268">268</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="269">269</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> String::Interpolate::Named privides a single function, C<interpolate>, </td> </tr> <tr> <td class="h" > <a name="270">270</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> which is exported by default. </td> </tr> <tr> <td class="h" > <a name="271">271</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="272">272</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> The subroutine takes two arguments: a reference to a control hash and </td> </tr> <tr> <td class="h" > <a name="273">273</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> the template string. </td> </tr> <tr> <td class="h" > <a name="274">274</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="275">275</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> $result = interpolate( \%ctl, $template ); </td> </tr> <tr> <td class="h" > <a name="276">276</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="277">277</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =cut </td> </tr> <tr> <td class="h" > <a name="278">278</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="279">279</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head1 METHODS </td> </tr> <tr> <td class="h" > <a name="280">280</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="281">281</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head2 new </td> </tr> <tr> <td class="h" > <a name="282">282</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="283">283</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Constructs a new String::Interpolate::Named object. </td> </tr> <tr> <td class="h" > <a name="284">284</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="285">285</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my $ii = String::Interpolate::Named->new; </td> </tr> <tr> <td class="h" > <a name="286">286</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="287">287</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> or </td> </tr> <tr> <td class="h" > <a name="288">288</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="289">289</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my $ii = String::Interpolate::Named->new(\%ctl); </td> </tr> <tr> <td class="h" > <a name="290">290</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="291">291</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =cut </td> </tr> <tr> <td class="h" > <a name="292">292</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="293">293</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> sub new { </td> </tr> <tr> <td class="h" > <a name="294">294</a> </td> <td class="c3" > 2 </td> <td >   </td> <td >   </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--subroutine.html#294-1"> 2 </a> </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--subroutine.html#294-1"> 1 </a> </td> <td > 1566 </td> <td class="s"> my ( $pkg, $ctl ) = @_; </td> </tr> <tr> <td class="h" > <a name="295">295</a> </td> <td class="c3" > 2 </td> <td >   </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--condition.html#295-1"> 100 </a> </td> <td >   </td> <td >   </td> <td > 15 </td> <td class="s"> $ctl //= {}; </td> </tr> <tr> <td class="h" > <a name="296">296</a> </td> <td class="c3" > 2 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 8 </td> <td class="s"> bless $ctl => $pkg; </td> </tr> <tr> <td class="h" > <a name="297">297</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="298">298</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="299">299</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head2 ctl </td> </tr> <tr> <td class="h" > <a name="300">300</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="301">301</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Associates a control has with an existing object. </td> </tr> <tr> <td class="h" > <a name="302">302</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="303">303</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> $ii->ctl(\%ctl); </td> </tr> <tr> <td class="h" > <a name="304">304</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="305">305</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =cut </td> </tr> <tr> <td class="h" > <a name="306">306</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="307">307</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> sub ctl { </td> </tr> <tr> <td class="h" > <a name="308">308</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--subroutine.html#308-1"> 1 </a> </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--subroutine.html#308-1"> 1 </a> </td> <td > 19 </td> <td class="s"> my ( $self, $ctl ) = @_; </td> </tr> <tr> <td class="h" > <a name="309">309</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 9 </td> <td class="s"> $self->{$_} = $ctl->{$_} for keys(%$ctl); </td> </tr> <tr> <td class="h" > <a name="310">310</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 3 </td> <td class="s"> return $self; </td> </tr> <tr> <td class="h" > <a name="311">311</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="312">312</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="313">313</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head2 interpolate </td> </tr> <tr> <td class="h" > <a name="314">314</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="315">315</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> This routine performs the actual interpolations. It can be used as a method: </td> </tr> <tr> <td class="h" > <a name="316">316</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="317">317</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> $ii->interpolate($template); </td> </tr> <tr> <td class="h" > <a name="318">318</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="319">319</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> and functional: </td> </tr> <tr> <td class="h" > <a name="320">320</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="321">321</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> interpolate( \%ctl, $template ); </td> </tr> <tr> <td class="h" > <a name="322">322</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="323">323</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =cut </td> </tr> <tr> <td class="h" > <a name="324">324</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="325">325</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> sub interpolate { </td> </tr> <tr> <td class="h" > <a name="326">326</a> </td> <td class="c3" > 434 </td> <td >   </td> <td >   </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--subroutine.html#326-1"> 434 </a> </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--subroutine.html#326-1"> 1 </a> </td> <td > 526251 </td> <td class="s"> my ( $ctl, $tpl ) = @_; </td> </tr> <tr> <td class="h" > <a name="327">327</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="328">328</a> </td> <td class="c3" > 434 </td> <td >   </td> <td class="c0" > <a href="blib-lib-String-Interpolate-Named-pm--condition.html#328-1"> 50 </a> </td> <td >   </td> <td >   </td> <td > 2657 </td> <td class="s"> my $maxiter = $ctl->{maxiter} // 16; </td> </tr> <tr> <td class="h" > <a name="329">329</a> </td> <td class="c3" > 434 </td> <td >   </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--condition.html#329-1"> 100 </a> </td> <td >   </td> <td >   </td> <td > 1647 </td> <td class="s"> my $activator = $ctl->{activator} // '%'; </td> </tr> <tr> <td class="h" > <a name="330">330</a> </td> <td class="c3" > 434 </td> <td >   </td> <td class="c0" > <a href="blib-lib-String-Interpolate-Named-pm--condition.html#330-1"> 66 </a> </td> <td >   </td> <td >   </td> <td > 2801 </td> <td class="s"> my $keypat = $ctl->{keypattern} // qr/\w+[-_\w.]*/; </td> </tr> <tr> <td class="h" > <a name="331">331</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="332">332</a> </td> <td class="c3" > 434 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 1746 </td> <td class="s"> for ( my $cnt = 1; $cnt <= $maxiter; $cnt++ ) { </td> </tr> <tr> <td class="h" > <a name="333">333</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="334">334</a> </td> <td class="c3" > 829 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 1643 </td> <td class="s"> my $prev = $tpl; </td> </tr> <tr> <td class="h" > <a name="335">335</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="336">336</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> # Hide escaped specials by replacing them with Unicode noncharacters. </td> </tr> <tr> <td class="h" > <a name="337">337</a> </td> <td class="c3" > 829 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 2025 </td> <td class="s"> $tpl =~ s/\\\\/\x{fdd0}/g; </td> </tr> <tr> <td class="h" > <a name="338">338</a> </td> <td class="c3" > 829 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 1665 </td> <td class="s"> $tpl =~ s/\\\{/\x{fdd1}/g; </td> </tr> <tr> <td class="h" > <a name="339">339</a> </td> <td class="c3" > 829 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 1630 </td> <td class="s"> $tpl =~ s/\\\}/\x{fdd2}/g; </td> </tr> <tr> <td class="h" > <a name="340">340</a> </td> <td class="c3" > 829 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 2180 </td> <td class="s"> $tpl =~ s/\\\|/\x{fdd3}/g; </td> </tr> <tr> <td class="h" > <a name="341">341</a> </td> <td class="c3" > 829 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 4031 </td> <td class="s"> $tpl =~ s/\\\Q$activator\E/\x{fdd4}/g; </td> </tr> <tr> <td class="h" > <a name="342">342</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="343">343</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> # Replace some seqs by a single char for easy matching. </td> </tr> <tr> <td class="h" > <a name="344">344</a> </td> <td class="c3" > 829 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 3194 </td> <td class="s"> $tpl =~ s/\Q$activator\E\{\}/\x{fdde}/g; </td> </tr> <tr> <td class="h" > <a name="345">345</a> </td> <td class="c3" > 829 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 3764 </td> <td class="s"> $tpl =~ s/\Q$activator\E\{/\x{fddf}/g; </td> </tr> <tr> <td class="h" > <a name="346">346</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="347">347</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> # %{ key [ .index ] [ = value ] [ | then [ | else ] ] } </td> </tr> <tr> <td class="h" > <a name="348">348</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="349">349</a> </td> <td class="c3" > 829 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 1685 </td> <td class="s"> my $pre = ''; </td> </tr> <tr> <td class="h" > <a name="350">350</a> </td> <td class="c3" > 829 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 1444 </td> <td class="s"> my $post = ''; </td> </tr> <tr> <td class="h" > <a name="351">351</a> </td> <td class="c3" > 829 </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--branch.html#351-1"> 100 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 9122 </td> <td class="s"> if ( $tpl =~ s; ( ^ </td> </tr> <tr> <td class="h" > <a name="352">352</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> (?<pre> .*? ) </td> </tr> <tr> <td class="h" > <a name="353">353</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> \x{fddf} </td> </tr> <tr> <td class="h" > <a name="354">354</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> (?<key> $keypat ) </td> </tr> <tr> <td class="h" > <a name="355">355</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> (?: : (?<fmt> .*? ) )? </td> </tr> <tr> <td class="h" > <a name="356">356</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> (?: (?<op> \= ) </td> </tr> <tr> <td class="h" > <a name="357">357</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> (?<test> [^|}\x{fddf}]*) )? </td> </tr> <tr> <td class="h" > <a name="358">358</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> (?: \| (?<then> [^|}\x{fddf}]* ) </td> </tr> <tr> <td class="h" > <a name="359">359</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> (?: \| (?<else> [^|}\x{fddf}]* ) )? </td> </tr> <tr> <td class="h" > <a name="360">360</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> )? </td> </tr> <tr> <td class="h" > <a name="361">361</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> \} </td> </tr> <tr> <td class="h" > <a name="362">362</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> (?<post> .* ) </td> </tr> <tr> <td class="h" > <a name="363">363</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> $ </td> </tr> <tr> <td class="h" > <a name="364">364</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> ) </td> </tr> <tr> <td class="h" > <a name="365">365</a> </td> <td class="c3" > 395 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 12639 </td> <td class="s"> ; _interpolate($ctl, {%+} ) ;exso ) { </td> </tr> <tr> <td class="h" > <a name="366">366</a> </td> <td class="c3" > 395 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 3006 </td> <td class="s"> $pre = $+{pre}; </td> </tr> <tr> <td class="h" > <a name="367">367</a> </td> <td class="c3" > 395 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 1895 </td> <td class="s"> $post = $+{post}; </td> </tr> <tr> <td class="h" > <a name="368">368</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="369">369</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> else { </td> </tr> <tr> <td class="h" > <a name="370">370</a> </td> <td class="c3" > 434 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 799 </td> <td class="s"> $pre = $tpl; </td> </tr> <tr> <td class="h" > <a name="371">371</a> </td> <td class="c3" > 434 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 953 </td> <td class="s"> $tpl = ''; </td> </tr> <tr> <td class="h" > <a name="372">372</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="373">373</a> </td> <td class="c3" > 829 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 3551 </td> <td class="s"> for ( $pre, $tpl, $post ) { </td> </tr> <tr> <td class="h" > <a name="374">374</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> # Unescape escaped specials. </td> </tr> <tr> <td class="h" > <a name="375">375</a> </td> <td class="c3" > 2487 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 4824 </td> <td class="s"> s/\x{fdd0}/\\\\/g; </td> </tr> <tr> <td class="h" > <a name="376">376</a> </td> <td class="c3" > 2487 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 4562 </td> <td class="s"> s/\x{fdd1}/\\\{/g; </td> </tr> <tr> <td class="h" > <a name="377">377</a> </td> <td class="c3" > 2487 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 4444 </td> <td class="s"> s/\x{fdd2}/\\\}/g; </td> </tr> <tr> <td class="h" > <a name="378">378</a> </td> <td class="c3" > 2487 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 4572 </td> <td class="s"> s/\x{fdd3}/\\\|/g; </td> </tr> <tr> <td class="h" > <a name="379">379</a> </td> <td class="c3" > 2487 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 4626 </td> <td class="s"> s/\x{fdd4}/\\$activator/g; </td> </tr> <tr> <td class="h" > <a name="380">380</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="381">381</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> # Restore (some) seqs. </td> </tr> <tr> <td class="h" > <a name="382">382</a> </td> <td class="c3" > 2487 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 4389 </td> <td class="s"> s/\x{fdde}/$activator."{}"/ge; </td> </tr> <tr> <td class="h" > <a > </a> </td> <td class="c3" > 6 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 50 </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="383">383</a> </td> <td class="c3" > 2487 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 5221 </td> <td class="s"> s/\x{fddf}/$activator."{"/ge; </td> </tr> <tr> <td class="h" > <a > </a> </td> <td class="c3" > 48 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 217 </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="384">384</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="385">385</a> </td> <td class="c3" > 829 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 4634 </td> <td class="s"> $tpl =~ s/\\(\Q$activator\E|[{}|\\])/$1/g; </td> </tr> <tr> <td class="h" > <a name="386">386</a> </td> <td class="c3" > 829 </td> <td class="c0" > <a href="blib-lib-String-Interpolate-Named-pm--branch.html#386-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 2653 </td> <td class="s"> warn ("'$prev' => '$pre' '$tpl' '$post'\n" ) if $ctl->{trace}; </td> </tr> <tr> <td class="h" > <a name="387">387</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="388">388</a> </td> <td class="c3" > 829 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 1862 </td> <td class="s"> my $t = $pre . $tpl . $post; </td> </tr> <tr> <td class="h" > <a name="389">389</a> </td> <td class="c3" > 829 </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--branch.html#389-1"> 100 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 4863 </td> <td class="s"> if ( $prev eq $t ) { </td> </tr> <tr> <td class="h" > <a name="390">390</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> # De-escape in subst part only (issue #6); </td> </tr> <tr> <td class="h" > <a name="391">391</a> </td> <td class="c3" > 434 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 1604 </td> <td class="s"> $tpl =~ s/\\(\Q$activator\E|[{}|])/$1/g; </td> </tr> <tr> <td class="h" > <a name="392">392</a> </td> <td class="c3" > 434 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 3063 </td> <td class="s"> return $pre . $tpl . $post; </td> </tr> <tr> <td class="h" > <a name="393">393</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="394">394</a> </td> <td class="c3" > 395 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 986 </td> <td class="s"> $tpl = $t; </td> </tr> <tr> <td class="h" > <a name="395">395</a> </td> <td class="c3" > 395 </td> <td class="c0" > <a href="blib-lib-String-Interpolate-Named-pm--branch.html#395-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 1794 </td> <td class="s"> warn("$cnt: $prev -> $tpl\n") if $ctl->{trace}; </td> </tr> <tr> <td class="h" > <a name="396">396</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="397">397</a> </td> <td class="c0" > <a href="#439"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> Carp::croak("Maximum number of iterations exceeded"); </td> </tr> <tr> <td class="h" > <a name="398">398</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="399">399</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="400">400</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> sub _interpolate { </td> </tr> <tr> <td class="h" > <a name="401">401</a> </td> <td class="c3" > 395 </td> <td >   </td> <td >   </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--subroutine.html#401-1"> 395 </a> </td> <td >   </td> <td > 1070 </td> <td class="s"> my ( $ctl, $i ) = @_; </td> </tr> <tr> <td class="h" > <a name="402">402</a> </td> <td class="c3" > 395 </td> <td >   </td> <td class="c0" > <a href="blib-lib-String-Interpolate-Named-pm--condition.html#402-1"> 50 </a> </td> <td >   </td> <td >   </td> <td > 1465 </td> <td class="s"> my $key = $i->{key} // ''; </td> </tr> <tr> <td class="h" > <a name="403">403</a> </td> <td class="c3" > 395 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 850 </td> <td class="s"> my $m = $ctl->{args}; </td> </tr> <tr> <td class="h" > <a name="404">404</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="405">405</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> # Establish the value for this key. </td> </tr> <tr> <td class="h" > <a name="406">406</a> </td> <td class="c3" > 395 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 711 </td> <td class="s"> my $val = ''; </td> </tr> <tr> <td class="h" > <a name="407">407</a> </td> <td class="c3" > 395 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 707 </td> <td class="s"> my $inx = 0; </td> </tr> <tr> <td class="h" > <a name="408">408</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="409">409</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> # Split off possible index. </td> </tr> <tr> <td class="h" > <a name="410">410</a> </td> <td class="c3" > 395 </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--branch.html#410-1"> 100 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 1491 </td> <td class="s"> if ( $key =~ /^(.*)\.(-?\d+)$/ ) { </td> </tr> <tr> <td class="h" > <a name="411">411</a> </td> <td class="c3" > 7 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 28 </td> <td class="s"> ( $key, $inx ) = ( $1, $2 ); </td> </tr> <tr> <td class="h" > <a name="412">412</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="413">413</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="414">414</a> </td> <td class="c3" > 395 </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--branch.html#414-1"> 100 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 1654 </td> <td class="s"> my $newval = ref($m) eq 'CODE' ? $m->($key) : $m->{$key}; </td> </tr> <tr> <td class="h" > <a name="415">415</a> </td> <td class="c3" > 395 </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--branch.html#415-1"> 100 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 1441 </td> <td class="s"> if ( defined $newval ) { </td> </tr> <tr> <td class="h" > <a name="416">416</a> </td> <td class="c3" > 314 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 668 </td> <td class="s"> $val = $newval; </td> </tr> <tr> <td class="h" > <a name="417">417</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="418">418</a> </td> <td class="c3" > 314 </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--branch.html#418-1"> 100 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 1329 </td> <td class="s"> if ( UNIVERSAL::isa( $val, 'ARRAY' ) ) { </td> </tr> <tr> <td class="h" > <a > </a> </td> <td >   </td> <td class="c0" > <a href="blib-lib-String-Interpolate-Named-pm--branch.html#-2"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="419">419</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> # 1, 2, ... selects 1st, 2nd value; -1 counts from end. </td> </tr> <tr> <td class="h" > <a name="420">420</a> </td> <td class="c3" > 236 </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--branch.html#420-1"> 100 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 569 </td> <td class="s"> if ( $inx ) { </td> </tr> <tr> <td class="h" > <a name="421">421</a> </td> <td class="c3" > 6 </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--branch.html#421-1"> 100 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 20 </td> <td class="s"> if ( $inx > 0 ) { </td> </tr> <tr> <td class="h" > <a name="422">422</a> </td> <td class="c3" > 4 </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--branch.html#422-1"> 100 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 13 </td> <td class="s"> if ( $inx <= @$val ) { </td> </tr> <tr> <td class="h" > <a name="423">423</a> </td> <td class="c3" > 3 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 9 </td> <td class="s"> $val = $val->[$inx-1]; </td> </tr> <tr> <td class="h" > <a name="424">424</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="425">425</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> else { </td> </tr> <tr> <td class="h" > <a name="426">426</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 3 </td> <td class="s"> $val = ""; </td> </tr> <tr> <td class="h" > <a name="427">427</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="428">428</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="429">429</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> else { </td> </tr> <tr> <td class="h" > <a name="430">430</a> </td> <td class="c3" > 2 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 7 </td> <td class="s"> $val = $val->[$inx]; </td> </tr> <tr> <td class="h" > <a name="431">431</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="432">432</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="433">433</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> # Zero or none means concatenate all. </td> </tr> <tr> <td class="h" > <a name="434">434</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> else { </td> </tr> <tr> <td class="h" > <a name="435">435</a> </td> <td class="c3" > 230 </td> <td >   </td> <td class="c0" > <a href="blib-lib-String-Interpolate-Named-pm--condition.html#435-1"> 66 </a> </td> <td >   </td> <td >   </td> <td > 1312 </td> <td class="s"> $val = join( $ctl->{separator} // $", @$val ); </td> </tr> <tr> <td class="h" > <a name="436">436</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="437">437</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="438">438</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> elsif ( $inx ) { </td> </tr> <tr> <td class="h" > <a name="439">439</a> </td> <td class="c0" > <a href="#466"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> Carp::croak("Expecting an array for variable '$key'") </td> </tr> <tr> <td class="h" > <a name="440">440</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="441">441</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="442">442</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="443">443</a> </td> <td class="c3" > 395 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 837 </td> <td class="s"> my $subst = ''; </td> </tr> <tr> <td class="h" > <a name="444">444</a> </td> <td class="c3" > 395 </td> <td >   </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--condition.html#444-1"> 100 </a> </td> <td >   </td> <td >   </td> <td > 2125 </td> <td class="s"> for ( split( /(?<!\\):/, $i->{fmt}//'' ) ) { </td> </tr> <tr> <td class="h" > <a name="445">445</a> </td> <td class="c3" > 165 </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--branch.html#445-1"> 100 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 462 </td> <td class="s"> last unless defined $newval; </td> </tr> <tr> <td class="h" > <a name="446">446</a> </td> <td class="c3" > 155 </td> <td class="c0" > <a href="blib-lib-String-Interpolate-Named-pm--branch.html#446-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 453 </td> <td class="s"> next unless my $fmt = $_; </td> </tr> <tr> <td class="h" > <a name="447">447</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="448">448</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> # Simple formatters. </td> </tr> <tr> <td class="h" > <a name="449">449</a> </td> <td class="c3" > 155 </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--branch.html#449-1"> 100 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 1196 </td> <td class="s"> if ( $fmt eq 'lc' ) { $val = lc($val) } </td> </tr> <tr> <td class="h" > <a > </a> </td> <td class="c3" > 15 </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--branch.html#-2"> 100 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 51 </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a > </a> </td> <td >   </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--branch.html#-3"> 100 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a > </a> </td> <td >   </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--branch.html#-4"> 100 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a > </a> </td> <td >   </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--branch.html#-5"> 100 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a > </a> </td> <td >   </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--branch.html#-6"> 100 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a > </a> </td> <td >   </td> <td class="c0" > <a href="blib-lib-String-Interpolate-Named-pm--branch.html#-7"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="450">450</a> </td> <td class="c3" > 5 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 22 </td> <td class="s"> elsif ( $fmt eq 'uc' ) { $val = uc($val) } </td> </tr> <tr> <td class="h" > <a name="451">451</a> </td> <td class="c3" > 10 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 54 </td> <td class="s"> elsif ( $fmt eq 'sc' ) { $val = ucfirst($val) } </td> </tr> <tr> <td class="h" > <a name="452">452</a> </td> <td class="c3" > 10 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 43 </td> <td class="s"> elsif ( $fmt eq 'ic' ) { $val = f_ic($val) } </td> </tr> <tr> <td class="h" > <a name="453">453</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="454">454</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> # Functions. </td> </tr> <tr> <td class="h" > <a name="455">455</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> elsif ( $fmt =~ /^([lr])pad\((\d+)(?:,(.*?))?\)$/ ) { </td> </tr> <tr> <td class="h" > <a name="456">456</a> </td> <td class="c3" > 55 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 181 </td> <td class="s"> $val = f_pad( $val, $1, $2, $3 ); </td> </tr> <tr> <td class="h" > <a name="457">457</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="458">458</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="459">459</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> elsif ( $fmt =~ /^replace\((.+?),(.*?)\)$/ ) { </td> </tr> <tr> <td class="h" > <a name="460">460</a> </td> <td class="c3" > 40 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 119 </td> <td class="s"> $val = f_replace( $val, $1, $2 ); </td> </tr> <tr> <td class="h" > <a name="461">461</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="462">462</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="463">463</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> # Printf formatting. </td> </tr> <tr> <td class="h" > <a name="464">464</a> </td> <td class="c3" > 20 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 64 </td> <td class="s"> elsif ( $fmt =~ /^%/ ) { $val = f_printf( $val, $fmt ) } </td> </tr> <tr> <td class="h" > <a name="465">465</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="466">466</a> </td> <td class="c0" > 0 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 0 </td> <td class="s"> else { Carp::croak("Invalid format code '$fmt'"); } </td> </tr> <tr> <td class="h" > <a name="467">467</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="468">468</a> </td> <td class="c3" > 395 </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--branch.html#468-1"> 100 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 1307 </td> <td class="s"> if ( $i->{op} ) { </td> </tr> <tr> <td class="h" > <a > </a> </td> <td >   </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--branch.html#-2"> 100 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="469">469</a> </td> <td class="c3" > 76 </td> <td >   </td> <td class="c0" > <a href="blib-lib-String-Interpolate-Named-pm--condition.html#469-1"> 50 </a> </td> <td >   </td> <td >   </td> <td > 236 </td> <td class="s"> my $test = $i->{test} // ''; </td> </tr> <tr> <td class="h" > <a name="470">470</a> </td> <td class="c3" > 76 </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--branch.html#470-1"> 100 </a> </td> <td class="c0" > <a href="blib-lib-String-Interpolate-Named-pm--condition.html#470-1"> 66 </a> </td> <td >   </td> <td >   </td> <td > 440 </td> <td class="s"> if ( $i->{op} eq '=' && $val eq $test ) { </td> </tr> <tr> <td class="h" > <a name="471">471</a> </td> <td class="c3" > 40 </td> <td >   </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--condition.html#471-1"> 100 </a> </td> <td >   </td> <td >   </td> <td > 258 </td> <td class="s"> $subst = $i->{then} // ''; </td> </tr> <tr> <td class="h" > <a name="472">472</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="473">473</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> else { </td> </tr> <tr> <td class="h" > <a name="474">474</a> </td> <td class="c3" > 36 </td> <td >   </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--condition.html#474-1"> 100 </a> </td> <td >   </td> <td >   </td> <td > 163 </td> <td class="s"> $subst = $i->{else} // ''; </td> </tr> <tr> <td class="h" > <a name="475">475</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="476">476</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="477">477</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> elsif ( $val ne '' ) { </td> </tr> <tr> <td class="h" > <a name="478">478</a> </td> <td class="c3" > 254 </td> <td >   </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--condition.html#478-1"> 100 </a> </td> <td >   </td> <td >   </td> <td > 1009 </td> <td class="s"> $subst = $i->{then} // $val; </td> </tr> <tr> <td class="h" > <a name="479">479</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="480">480</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> else { </td> </tr> <tr> <td class="h" > <a name="481">481</a> </td> <td class="c3" > 65 </td> <td >   </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--condition.html#481-1"> 100 </a> </td> <td >   </td> <td >   </td> <td > 366 </td> <td class="s"> $subst = $i->{else} // ''; </td> </tr> <tr> <td class="h" > <a name="482">482</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="483">483</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="484">484</a> </td> <td class="c3" > 395 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 1140 </td> <td class="s"> $subst =~ s/\x{fdde}/$val/g; </td> </tr> <tr> <td class="h" > <a name="485">485</a> </td> <td class="c3" > 395 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 2454 </td> <td class="s"> return $subst; </td> </tr> <tr> <td class="h" > <a name="486">486</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="487">487</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="488">488</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> # Formatter functions. </td> </tr> <tr> <td class="h" > <a name="489">489</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> # First arg = $val. </td> </tr> <tr> <td class="h" > <a name="490">490</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> # Return new value. </td> </tr> <tr> <td class="h" > <a name="491">491</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="492">492</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> sub f_ic { </td> </tr> <tr> <td class="h" > <a name="493">493</a> </td> <td class="c3" > 10 </td> <td >   </td> <td >   </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--subroutine.html#493-1"> 10 </a> </td> <td class="c0" > <a href="blib-lib-String-Interpolate-Named-pm--subroutine.html#493-1"> 0 </a> </td> <td > 27 </td> <td class="s"> my ( $val ) = @_; </td> </tr> <tr> <td class="h" > <a name="494">494</a> </td> <td class="c3" > 10 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 103 </td> <td class="s"> join('', map { ucfirst } (split( /(^|\s+|-)/, $val ))); </td> </tr> <tr> <td class="h" > <a > </a> </td> <td class="c3" > 30 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 157 </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="495">495</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="496">496</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="497">497</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> sub f_pad { </td> </tr> <tr> <td class="h" > <a name="498">498</a> </td> <td class="c3" > 55 </td> <td >   </td> <td >   </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--subroutine.html#498-1"> 55 </a> </td> <td class="c0" > <a href="blib-lib-String-Interpolate-Named-pm--subroutine.html#498-1"> 0 </a> </td> <td > 328 </td> <td class="s"> my ( $val, $lr, $len, $str ) = @_; </td> </tr> <tr> <td class="h" > <a name="499">499</a> </td> <td class="c3" > 55 </td> <td >   </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--condition.html#499-1"> 100 </a> </td> <td >   </td> <td >   </td> <td > 269 </td> <td class="s"> $str //= " "; </td> </tr> <tr> <td class="h" > <a name="500">500</a> </td> <td class="c3" > 55 </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--branch.html#500-1"> 100 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 263 </td> <td class="s"> return $val unless ( my $need = $len - length($val) ) > 0; </td> </tr> <tr> <td class="h" > <a name="501">501</a> </td> <td class="c3" > 30 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 171 </td> <td class="s"> my $pad = $str x (1+int(($len-1)/length($str))); </td> </tr> <tr> <td class="h" > <a name="502">502</a> </td> <td class="c3" > 30 </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--branch.html#502-1"> 100 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 95 </td> <td class="s"> if ( $lr eq 'l' ) { </td> </tr> <tr> <td class="h" > <a name="503">503</a> </td> <td class="c3" > 15 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 125 </td> <td class="s"> return substr( $pad, 0, $need ) . $val; </td> </tr> <tr> <td class="h" > <a name="504">504</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="505">505</a> </td> <td class="c3" > 15 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 91 </td> <td class="s"> $val . substr( $pad, 0, $need ); </td> </tr> <tr> <td class="h" > <a name="506">506</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="507">507</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="508">508</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> sub f_replace { </td> </tr> <tr> <td class="h" > <a name="509">509</a> </td> <td class="c3" > 40 </td> <td >   </td> <td >   </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--subroutine.html#509-1"> 40 </a> </td> <td class="c0" > <a href="blib-lib-String-Interpolate-Named-pm--subroutine.html#509-1"> 0 </a> </td> <td > 244 </td> <td class="s"> my ( $val, $rep, $str ) = @_; </td> </tr> <tr> <td class="h" > <a name="510">510</a> </td> <td class="c3" > 40 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 725 </td> <td class="s"> $val =~ s/\Q$rep\E/$str/g; </td> </tr> <tr> <td class="h" > <a name="511">511</a> </td> <td class="c3" > 40 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 187 </td> <td class="s"> $val; </td> </tr> <tr> <td class="h" > <a name="512">512</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="513">513</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="514">514</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> sub f_printf { </td> </tr> <tr> <td class="h" > <a name="515">515</a> </td> <td class="c3" > 20 </td> <td >   </td> <td >   </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--subroutine.html#515-1"> 20 </a> </td> <td class="c0" > <a href="blib-lib-String-Interpolate-Named-pm--subroutine.html#515-1"> 0 </a> </td> <td > 52 </td> <td class="s"> my ( $val, $fmt ) = @_; </td> </tr> <tr> <td class="h" > <a name="516">516</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> # A common problem is when a numeric format does not </td> </tr> <tr> <td class="h" > <a name="517">517</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> # have a value to format. Suppress the warning. </td> </tr> <tr> <td class="h" > <a name="518">518</a> </td> <td class="c3" > 8 </td> <td >   </td> <td >   </td> <td class="c3" > <a href="blib-lib-String-Interpolate-Named-pm--subroutine.html#518-1"> 8 </a> </td> <td >   </td> <td > 21471 </td> <td class="s"> no warnings qw(numeric); </td> </tr> <tr> <td class="h" > <a > </a> </td> <td class="c3" > 8 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 18 </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a > </a> </td> <td class="c3" > 8 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 948 </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="519">519</a> </td> <td class="c3" > 20 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 167 </td> <td class="s"> sprintf( $fmt, $val ); </td> </tr> <tr> <td class="h" > <a name="520">520</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="521">521</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="522">522</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head1 REQUIREMENTS </td> </tr> <tr> <td class="h" > <a name="523">523</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="524">524</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Minimal Perl version 5.10.1. </td> </tr> <tr> <td class="h" > <a name="525">525</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="526">526</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head1 AUTHOR </td> </tr> <tr> <td class="h" > <a name="527">527</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="528">528</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Johan Vromans, C<< <JV at CPAN dot org> >> </td> </tr> <tr> <td class="h" > <a name="529">529</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="530">530</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head1 SUPPORT </td> </tr> <tr> <td class="h" > <a name="531">531</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="532">532</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Development of this module takes place on GitHub: </td> </tr> <tr> <td class="h" > <a name="533">533</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> L<https://github.com/sciurius/perl-String-Interpolate-Named>. </td> </tr> <tr> <td class="h" > <a name="534">534</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="535">535</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> You can find documentation for this module with the perldoc command. </td> </tr> <tr> <td class="h" > <a name="536">536</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="537">537</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> perldoc String::Interpolate::Named </td> </tr> <tr> <td class="h" > <a name="538">538</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="539">539</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Please report any bugs or feature requests using the issue tracker on </td> </tr> <tr> <td class="h" > <a name="540">540</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> GitHub. </td> </tr> <tr> <td class="h" > <a name="541">541</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="542">542</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head1 ACKNOWLEDGEMENTS </td> </tr> <tr> <td class="h" > <a name="543">543</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="544">544</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Many of the existing template / interpolate / substitute modules. </td> </tr> <tr> <td class="h" > <a name="545">545</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="546">546</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head1 COPYRIGHT & LICENSE </td> </tr> <tr> <td class="h" > <a name="547">547</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="548">548</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Copyright 2018,2025 Johan Vromans, all rights reserved. </td> </tr> <tr> <td class="h" > <a name="549">549</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="550">550</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> This program is free software; you can redistribute it and/or modify it </td> </tr> <tr> <td class="h" > <a name="551">551</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> under the same terms as Perl itself. </td> </tr> <tr> <td class="h" > <a name="552">552</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="553">553</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =cut </td> </tr> <tr> <td class="h" > <a name="554">554</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="555">555</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> 1; </td> </tr> </table> </body> </html>