エラー メッセージをわざと、あえて出して喜ぶコーナー、今日は「/%s/ should probably be written as "%s"」です。これは「/文字列/は、たぶん"文字列"と書くべきであっただろう」という意味です。


これはエラーではなくて警告で、use warnings;プラグマを付けたら発生します。
実行します。
見事に出したいエラーが出ましたね。もう1個やってみます。
今度は出したい警告だけになりました。
直してみます。
無事何も警告されなくなりました。
split関数は、文字列を分解してリストを返す関数です。
では、文字列$strを1個以上の空白で分解して@arrに格納しました。
このように、柔軟な分解が出来るように第1引数にはマッチ演算子(//で囲んだ正規表現パターン)を渡します。
一方、join関数は、リストを結合して文字列を返す関数です。
では、配列@arrの間に、1個のアンダースコアを挟んで結合したものをsayで出力しています。
splitは、区切り文字を入力するので、柔軟な区切り文字を与えるためにパターンが渡せるようになっています。
しかし、joinは、区切り文字が固定なので(1個以上の空白で適当にくっつけて、などという注文は無意味なので)固定文字列を渡すようにあっています。
これを、splitと混同して、第1引数にパターンを渡してしまったために起きたのが今回の警告でした。
ただ、警告するだけでなんとか実行しています。
では、$_に//で囲まれた正規表現パターンがマッチするかどうかを吟味して、その真偽値をjoinの第1引数に渡しています。
1個目の
では、$_が未定義値だったので「未定義の$_にパターンマッチしているよ」という警告も食らっています。
でも、これも警告だったので、プログラムは続行し、「love」「and」「mercy」という3つの文字列を空文字列(マッチ演算子が返した真偽値の偽)で結合して「loveandmercy」と出力しています。
2個めの
では、$_に"_"を渡しておいたので、/_/が真を返します。この真(数字の1)が挟まって、「love1and1mercy」という奇態な文字列が表示されました。
「これ、joinの第1引数にマッチ演算子が渡されたから、真偽値を挟んでjoinしたけど、本当にあなたそんなことやりたかったんですか」というのが今日のお題の警告です。
Perlの警告、エラーはどことなく言い方が優しくてユーモラスな感じがします。
#! /usr/local/bin/perl
# splitAndJoin.pl -- splitしてjoin
use strict;
use warnings;
use 5.10.0;
my $str = "love and mercy";
my @arr = split / +/, $str;
say join /_/, @arr;
# splitAndJoin.pl -- splitしてjoin
use strict;
use warnings;
use 5.10.0;
my $str = "love and mercy";
my @arr = split / +/, $str;
say join /_/, @arr;
実行します。
[sample]$ ./splitAndJoin.pl
/_/ should probably be written as "_" at ./splitAndJoin.pl line 12.
Use of uninitialized value $_ in pattern match (m//) at ./splitAndJoin.pl line 12.
loveandmercy
[sample]$
/_/ should probably be written as "_" at ./splitAndJoin.pl line 12.
Use of uninitialized value $_ in pattern match (m//) at ./splitAndJoin.pl line 12.
loveandmercy
[sample]$
見事に出したいエラーが出ましたね。もう1個やってみます。
#! /usr/local/bin/perl
# splitAndJoin2.pl -- splitしてjoin
use strict;
use warnings;
use 5.10.0;
$_ = "_";
my $str = "love and mercy";
my @arr = split / +/, $str;
say join /_/, @arr;
# splitAndJoin2.pl -- splitしてjoin
use strict;
use warnings;
use 5.10.0;
$_ = "_";
my $str = "love and mercy";
my @arr = split / +/, $str;
say join /_/, @arr;
[sample]$ ./splitAndJoin2.pl
/_/ should probably be written as "_" at ./splitAndJoin2.pl line 14.
love1and1mercy
/_/ should probably be written as "_" at ./splitAndJoin2.pl line 14.
love1and1mercy
今度は出したい警告だけになりました。
直してみます。
#! /usr/local/bin/perl
# splitAndJoin3.pl -- splitしてjoin
use strict;
use warnings;
use 5.10.0;
$_ = "_";
my $str = "love and mercy";
my @arr = split / +/, $str;
say join "_", @arr;
# splitAndJoin3.pl -- splitしてjoin
use strict;
use warnings;
use 5.10.0;
$_ = "_";
my $str = "love and mercy";
my @arr = split / +/, $str;
say join "_", @arr;
[sample]$ ./splitAndJoin3.pl
love_and_mercy
love_and_mercy
無事何も警告されなくなりました。
split関数は、文字列を分解してリストを返す関数です。
my @arr = split / +/, $str;
では、文字列$strを1個以上の空白で分解して@arrに格納しました。
このように、柔軟な分解が出来るように第1引数にはマッチ演算子(//で囲んだ正規表現パターン)を渡します。
一方、join関数は、リストを結合して文字列を返す関数です。
say join "_", @arr;
では、配列@arrの間に、1個のアンダースコアを挟んで結合したものをsayで出力しています。
splitは、区切り文字を入力するので、柔軟な区切り文字を与えるためにパターンが渡せるようになっています。
しかし、joinは、区切り文字が固定なので(1個以上の空白で適当にくっつけて、などという注文は無意味なので)固定文字列を渡すようにあっています。
これを、splitと混同して、第1引数にパターンを渡してしまったために起きたのが今回の警告でした。
ただ、警告するだけでなんとか実行しています。
say join /_/, @arr;
では、$_に//で囲まれた正規表現パターンがマッチするかどうかを吟味して、その真偽値をjoinの第1引数に渡しています。
1個目の
[sample]$ ./splitAndJoin.pl
/_/ should probably be written as "_" at ./splitAndJoin.pl line 12.
Use of uninitialized value $_ in pattern match (m//) at ./splitAndJoin.pl line 12.
loveandmercy
[sample]$
/_/ should probably be written as "_" at ./splitAndJoin.pl line 12.
Use of uninitialized value $_ in pattern match (m//) at ./splitAndJoin.pl line 12.
loveandmercy
[sample]$
では、$_が未定義値だったので「未定義の$_にパターンマッチしているよ」という警告も食らっています。
でも、これも警告だったので、プログラムは続行し、「love」「and」「mercy」という3つの文字列を空文字列(マッチ演算子が返した真偽値の偽)で結合して「loveandmercy」と出力しています。
2個めの
[sample]$ ./splitAndJoin2.pl
/_/ should probably be written as "_" at ./splitAndJoin2.pl line 14.
love1and1mercy
/_/ should probably be written as "_" at ./splitAndJoin2.pl line 14.
love1and1mercy
では、$_に"_"を渡しておいたので、/_/が真を返します。この真(数字の1)が挟まって、「love1and1mercy」という奇態な文字列が表示されました。
「これ、joinの第1引数にマッチ演算子が渡されたから、真偽値を挟んでjoinしたけど、本当にあなたそんなことやりたかったんですか」というのが今日のお題の警告です。
Perlの警告、エラーはどことなく言い方が優しくてユーモラスな感じがします。