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

US Navy 090421-N-1251W-057 Senior Chief Musician Adam Vincent, right, joins hands with bandleaders from China, Russia, India, and South Korea

 これはエラーではなくて警告で、use warnings;プラグマを付けたら発生します。

#! /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;

 実行します。

[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]$

 見事に出したいエラーが出ましたね。もう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;

[sample]$ ./splitAndJoin2.pl
/_/ 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;

[sample]$ ./splitAndJoin3.pl
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]$

では、$_が未定義値だったので「未定義の$_にパターンマッチしているよ」という警告も食らっています。
 でも、これも警告だったので、プログラムは続行し、「love」「and」「mercy」という3つの文字列を空文字列(マッチ演算子が返した真偽値の偽)で結合して「loveandmercy」と出力しています。

 2個めの

[sample]$ ./splitAndJoin2.pl
/_/ should probably be written as "_" at ./splitAndJoin2.pl line 14.
love1and1mercy

では、$_に"_"を渡しておいたので、/_/が真を返します。この真(数字の1)が挟まって、「love1and1mercy」という奇態な文字列が表示されました。

 「これ、joinの第1引数にマッチ演算子が渡されたから、真偽値を挟んでjoinしたけど、本当にあなたそんなことやりたかったんですか」というのが今日のお題の警告です。
 Perlの警告、エラーはどことなく言い方が優しくてユーモラスな感じがします。