ProgrammingPerl 開発者

Perlでは、異なるタイプの文字列における配列、ハッシュ、スカラの補間がどのように行われるか、またこのメカニズムに関連する危険性について教えてください。

Hintsage AIアシスタントで面接を突破

回答

Perlでは、ダブルクォーテーション("")や特定のテンプレート(例:heredoc)での変数の補間がサポートされています。スカラは次のように単純に補間されます:

my $name = 'Bob'; print "Hello, $name! "; # Hello, Bob!

配列はダブルクォーテーション内で補間された後、要素が$"(デフォルトはスペース)で区切られた文字列に変換されます:

my @items = ('a','b','c'); print "List: @items "; # List: a b c

ハッシュはキー=>値の形式で補間され、$;で区切られます。

my %h = (x => 1, y => 2); print "Hash: %h "; # Hash: x1y2(異なる場合もあり)

シングルクォーテーション(' ')内では、何も補間されません — 文字列はそのまま出力されます。

また、複雑な表現を中括弧を使って補間することもできます:

print "${name}_test "; # Bob_test

危険性としては、特殊文字の偶然の補間や、配列、ハッシュ、スカラの動作の違いがあります。


ひっかけ質問

なぜ文字列 "Total: $total$val" は時々正しく動作しないのですか?

一般的な答え:"すべてそのまま補間される!"

正しい答え:

文字列 "Total: $total$val" は、変数 $total だけを正しく補間する可能性がありますが、変数 $val は認識されないか、Perl が間違った範囲を補間する可能性があります。変数名が似ている場合にあいまいさを避けるためには、中括弧を使用してください:

print "Total: ${total}${val} ";

歴史


歴史 1

レポートでは、合計の文字列は次のように表示されました:「合計: $sum руб。」。 $rub 変数がコードに追加された後、文字列は「合計: $sum$rub」となり、結果として補間は $sum のみで、$rub がスキップされ、警告が発生しました。誰も理解できませんでしたが、出力された空の文字列を見て初めて気付きました。


歴史 2

SQL クエリを生成する際に、@values を介しての配列の補間が join なしで使用されました:"IN (@values)"。これにより、期待されるカンマ区切りのリストではなく、スペース区切りの文字列が生成されました。結果的に、SQL エラーと不正な選択が発生しました。


歴史 3

ハッシュのキーのリストを表示するために、%h を文字列「Keys: %h」に使用しました。これにより、キー-値の文字列が結合されてしまい、良いキーのリストが得られませんでした。正しくは、join ", ", keys %h を行うべきでした。