4.1. String Delimiters
Unexpectedly interpolating a variable in a character string is a common source of errors in Perl programs. So is unexpected non-interpolation. Fortunately, Perl provides two distinct types of strings that make it easy to specify exactly what you want. If you're creating a literal character string and you definitely intend to interpolate one or more variables into it, use a double-quoted string:
my $spam_name = "$title $first_name $surname";
my $pay_rate = "$minimal for maximal work"; If you're creating a literal character string and not intending to interpolate any variables into it, use a single-quoted string:
my $spam_name = 'Dr Lawrence Mwalle';
my $pay_rate = '$minimal for maximal work'; If your uninterpolated string includes a literal single quote, use the q{...} form instead:
my $spam_name = q{Dr Lawrence ('Larry') Mwalle};
my $pay_rate = q{'$minimal' for maximal work}; Don't use backslashes as quote delimiters; they only make it harder to distinguish the content from the container: my $spam_name = 'Dr Lawrence (\'Larry\') Mwalle'; my $pay_rate = '\'$minimal\' for maximal work'; If your uninterpolated string includes both a literal single quote and an unbalanced brace, use square brackets as delimiters instead:
my $spam_name = q[Dr Lawrence }Larry{ Mwalle];
my $pay_rate = q['$minimal' for warrior's work {{:-)]; Reserving interpolating quoters for strings that actually do interpolate something[*] can help you avoid unintentional interpolations, because the presence of a $ or @ in a single-quoted string then becomes a sign that something might be amiss. Likewise, once you become used to seeing double quotes only on interpolated strings, the absence of any variable in a double-quoted string becomes a warning sign. So these rules also help highlight missing intentional interpolations.
The four distinct rules are fine for isolated literals, but when you're creating a set of related string values, mixing and matching the rules can severely reduce the readability of your code: my $title = 'Perl Best Practices'; my $publisher = q{O'Reilly}; my $end_of_block = '}'; my $closing_delim = q['}]; my $citation = "$title ($publisher)"; For sequences of "parallel" strings, choose the most general delimiters required and use them consistently throughout the set:
my $title = q[Perl Best Practices];
my $publisher = q[O'Reilly];
my $end_of_block = q[}];
my $closing_delim = q['}];
my $citation = qq[$title ($publisher)]; Note that there's a two-column gap between the assignment operator and each q[...] character string. This aligns the string delimiters with those of the lone qq[...] string, which helps its keyword stand out and draws attention to its different semantics. |