Perl Language
文字列と引用方法
サーチ…
備考
バージョン構文では、まだ存在しないバージョンを守ることはできません。これは、誰かが戻って一度だけ編集することを思い出させるものです(RE:Perl 5.26)。バージョンガードは、ソースチェックアウトを行うのに十分なほど勇敢な人に利用可能な一時的な機能のための「将来の」分類を必要としています。
文字列リテラルの引用
文字列リテラルは、エスケープや補間を意味しません(文字列終端文字を引用する場合を除く)
print 'This is a string literal\n'; # emits a literal \ and n to terminal
print 'This literal contains a \'postraphe '; # emits the ' but not its preceding \
衝突を避けるために、代わりの引用機構を使うことができます:
print q/This is is a literal \' <-- 2 characters /; # prints both \ and '
print q^This is is a literal \' <-- 2 characters ^; # also
特定の選択された引用符文字は、
print q{ This is a literal and I contain { parens! } }; # prints inner { }
二重引用符
二重引用符で囲まれた文字列は、一重引用符で囲まれた文字列と異なり、 補間とエスケープを使用します。文字列を二重引用符で囲むには、二重引用符"
またはqq
演算子を使用します。
my $greeting = "Hello!\n";
print $greeting;
# => Hello! (followed by a linefeed)
my $bush = "They misunderestimated me."
print qq/As Bush once said: "$bush"\n/;
# => As Bush once said: "They misunderestimated me." (with linefeed)
qq
は、引用符を逃さなければならないのを避けるため、ここでは便利です。それがなければ、私たちは書く必要があります...
print "As Bush once said: \"$bush\"\n";
...それはちょうどいいではありません。
Perlは/
qq
スラッシュを使用することに制限しません。任意の(可視の)文字を使用できます。
use feature 'say';
say qq/You can use slashes.../;
say qq{...or braces...};
say qq^...or hats...^;
say qq|...or pipes...|;
# say qq ...but not whitespace. ;
配列を文字列に補間することもできます。
use feature 'say';
my @letters = ('a', 'b', 'c');
say "I like these letters: @letters.";
# => I like these letters: a b c.
デフォルトでは、値はスペースで区切られています - 特別な変数$"
デフォルトで1つのスペースになっています。これはもちろん変更できます。
use feature 'say';
my @letters = ('a', 'b', 'c');
{local $" = ", "; say "@letters"; } # a, b, c
必要に$LIST_SEPARATOR
、 use English
をuse English
、代わりに$LIST_SEPARATOR
を変更use English
オプションがあります:
use v5.18; # English should be avoided on older Perls
use English;
my @letters = ('a', 'b', 'c');
{ local $LIST_SEPARATOR = "\n"; say "My favourite letters:\n\n@letters" }
これより複雑なものについては、代わりにループを使用する必要があります。
say "My favourite letters:";
say;
for my $letter (@letters) {
say " - $letter";
}
補間はハッシュでは機能しません 。
use feature 'say';
my %hash = ('a', 'b', 'c', 'd');
say "This doesn't work: %hash" # This doesn't work: %hash
いくつかのコードは参照の補間を濫用します。
use feature 'say';
say "2 + 2 == @{[ 2 + 2 ]}"; # 2 + 2 = 4 (avoid this)
say "2 + 2 == ${\( 2 + 2 )}"; # 2 + 2 = 4 (avoid this)
いわゆる「カート演算子は、」間接参照にPerlを引き起こし@{ ... }
配列参照[ ... ]
あなたが補間する式が含まれている2 + 2
。このトリックを使うと、Perlは無名配列を作成し、逆参照して破棄します。
${\( ... )}
バージョンは無駄になりませんが、それでもメモリを割り当てる必要があり、読みにくいです。
代わりに、次のように書いてください。
-
say "2 + 2 == " . 2 + 2;
-
my $result = 2 + 2; say "2 + 2 == $result"
Heredocs
大規模な複数行の文字列は、書き込みに負担がかかります。
my $variable = <<'EOF';
this block of text is interpreted literally,
no \'quotes matter, they're just text
only the trailing left-aligned EOF matters.
EOF
注:スタックオーバーフローの構文ハイライターを無視するようにしてください。これは間違っています。
補間されたHeredocsも同じように動作します。
my $variable = <<"I Want it to End";
this block of text is interpreted.
quotes\nare interpreted, and $interpolations
get interpolated...
but still, left-aligned "I Want it to End" matters.
I Want it to End
5.26.0 *で保留中のものは、あなたのために左パディングをトリムする「字下げHeredoc」構文です
my $variable = <<~"MuchNicer";
this block of text is interpreted.
quotes\nare interpreted, and $interpolations
get interpolated...
but still, left-aligned "I Want it to End" matters.
MuchNicer
末尾の改行を削除する
関数chomp
存在する場合、それに渡された各スカラーから、 一つの改行文字を削除します。 chomp
は元の文字列を変更し、削除された文字数を返します
my $str = "Hello World\n\n";
my $removed = chomp($str);
print $str; # "Hello World\n"
print $removed; # 1
# chomp again, removing another newline
$removed = chomp $str;
print $str; # "Hello World"
print $removed; # 1
# chomp again, but no newline to remove
$removed = chomp $str;
print $str; # "Hello World"
print $removed; # 0
一度に複数の文字列をchomp
することもできます:
my @strs = ("Hello\n", "World!\n\n"); # one newline in first string, two in second
my $removed = chomp(@strs); # @strs is now ("Hello", "World!\n")
print $removed; # 2
$removed = chomp(@strs); # @strs is now ("Hello", "World!")
print $removed; # 1
$removed = chomp(@strs); # @strs is still ("Hello", "World!")
print $removed; # 0
しかし、通常、どれくらいの改行が削除されたか心配する人はいないので、通常はchomp
はvoid文脈で見られます。通常、ファイルから行を読み込むためです。
while (my $line = readline $fh)
{
chomp $line;
# now do something with $line
}
my @lines = readline $fh2;
chomp (@lines); # remove newline from end of each line