may_decode('latin1', "...")

これ(↓)ですけど、utf8 フラグの立った文字列に、utf8 が立っていないけど \x80-\xff を含む文字列を連結しようとすると警告が出るのだと思い込んでいました。でも、やってみたら、警告でませんね。う〜む。そういうふるまいだったのか。

subtech - Bulknews::Subtech - Fix dodgy utf-8 bytes
すでに utf-8 なバイト列を latin-1 と解釈して utf-8 に二重エンコードすることで起きる文字化け(を表現する短い言葉ってないのかな)を直すコード。

で、私はあまのじゃくなので、逆を考えてみました。つまり連結するときに、どういう decode 処理をすれば、latin-1 と utf-8 を共存させることができるのだろうかと。
まずは下調べ。decode、decode_utf8 にどういう文字列を渡すと utf8 フラグが立ち、デコードが正常に終わるのか?

use warnings;
use Encode;

my $s = decode_utf8("abc");
print utf8::is_utf8($s) ? 'y' : 'n', "\n"; # 7bit ascii は utf8 フラグが立たない
$s = decode_utf8("\xe6\x95\x8f\xe8\xa1\x8c");
print utf8::is_utf8($s) ? 'y' : 'n', "\n"; # utf-8 は utf8 フラグが立つ
$s = "\x{654f}\x{884c}";
print utf8::is_utf8($s) ? 'y' : 'n', "\n"; # ucs-16 記法で作った utf-8 も utf8 フラグが立つ
$s = decode_utf8("\xa7section");
print utf8::is_utf8($s) ? 'y' : 'n', "\n"; # latin-1 は utf8 フラグが立たない
print $s, "\n";                            # しかも、変換結果は undef になる
$s = decode('latin-1', "\xa7section");
print utf8::is_utf8($s) ? 'y' : 'n', "\n"; # latin-1 として decode すると utf8 フラグが立つ

ということは、デコード前の文字列はデフォルトで utf-8 だとし、うまく変換できないときは latin-1 としてデコードさせればいいのではないでしょうか。utf8 フラグが既に立っている文字列はデコードをパスさせます。
may_decode という関数を定義して、常にそれをかませて文字列を連結させていけば、共存できそうです。

use strict;
use warnings;
use Encode;

sub may_decode {
    my($ie, $s) = @s;
    return $s if utf8::is_utf8($s);
    my $t = decode_utf8($s);
    $t = decode($ie, $s) unless defined $t;
    $t;
}

binmode STDOUT, ':encoding(shiftjis)';
my $ie = 'latin-1';
print may_decode($ie, "\x{654f}\x{884c} ") # 敏行
    . may_decode($ie, "abc ")              # abc
    . may_decode($ie, "\xa7section ")      # §section
    . may_decode($ie, "\xe6\x95\x8f\xe8\xa1\x8c ") # 敏行
    . may_decode($ie, "\x{654f}\x{884c}"), "\n";   # 敏行

一応、動きますが、関数をいちいちかまさないといけないのが、めんどくさいですね。Math::BigInt みたいにオブジェクトにして、bigint.pm のようにオペレータやリテラルに衣をつけてしまえばいいのか。そのうちやってみよう。