プロが教える店舗&オフィスのセキュリティ対策術

perlで日本語文字列を指定幅で折り返すツールを作りたく調べていたところ、Jcodeモジュールを使うのが良さそうであると考えました。

https://manpages.debian.org/testing/libjcode-pm- …

ーーーーーーーーーーーーーーーーーーーー
my $j = new Jcode($str);
my @result = ();
foreach my $buff ( $j->jfold($count) ){
push(@result, $buff);
}
ーーーーーーーーーーーーーーーーーーーー

という感じで、良い感じに折り返してくれるのですが、このままでは禁則処理がされません。

上記URLのドキュメントによると「Perl 5.8.1以降は3番目の引数$krefにEUCの文字列の配列リファレンスを 渡すことで、簡易的な行頭禁則処理(ぶら下がり)を行えます。」とあるのですが、具体的に$krefをどのように指定すれば良いかわからず往生しています。

スクリプトの文字コードをeucで作成して、

my @k = ("。", "、");
$j->jfold($count,,\@k)

などとやってもダメでした。
どのようにすれば、禁則処理を有効にできるでしょうか?

質問者からの補足コメント

  • うーん・・・

    ありがとうございます。

    以下のとおり試してみました。
    --
    #!/usr/bin/perl

    use Jcode;
    $count = 10;
    my $str = "この文章は、禁則処理をテストしています。";

    my $j = new Jcode($str);
    my @result = ();
    foreach my $buff ( $j->jfold($count,,["。", "、"]) ){
    push(@result, $buff);
    }

    print join("\n", @result);
    --

    結果、
    --
    # ./test.pl | nkf -w
    この文章は
    、禁則処理
    をテストし
    ています。
    --
    となり、やはり禁則処理が働かないようです。もう少し調べてみます。

    No.1の回答に寄せられた補足コメントです。 補足日時:2023/08/30 08:14
  • なお、OSはRocky9、perl 等のバージョンは以下のとおりです。

    # perl -v

    This is perl 5, version 32, subversion 1 (v5.32.1) built for x86_64-linux-thread-multi
    (with 52 registered patches, see perl -V for more detail)
    <snip>

    # rpm -qi perl-Jcode
    Name : perl-Jcode
    Version : 2.07
    Release : 30.el9
    <snip>

      補足日時:2023/08/30 08:17
  • HAPPY

    自己解決です。

    jfoldメソッドのルーツらしき解説を発見

    https://www.donzoko.net/cgi/jencode/

    ここに倣って、

    my @kinsoku = qw(。 、);

    としてもダメだったのですが、ふと思い立って、第2引数に \n を指定したらうまくいきました。

    my @kinsok= = ("。", "、");

    でも大丈夫でした。
    ちょっと釈然としませんが、出来たのでヨシとします。

      補足日時:2023/08/30 22:01

A 回答 (1件)

禁則処理を有効にするためには、$krefに禁則処理を行う文字列の配列を指定する必要があります。

この配列は、禁則処理を行う文字のEUC-JPコードを要素として持つ必要があります。

例えば、以下のコードは、句点と読点の禁則処理を行うことができます。

use Jcode;

my $str = "この文章は、禁則処理をテストしています。";

my $j = new Jcode($str);
my @result = ();
foreach my $buff ( $j->jfold($count,,["。", "、"]) ){
push(@result, $buff);
}

print join("\n", @result);



$krefに指定する文字列の配列は、空配列を指定することもできます。この場合、禁則処理は行われません。

また、$krefに指定する文字列の配列は、空文字を要素として持つこともできます。この場合、その文字の後ろに続く文字は、必ず行頭に置かれます。

例えば、以下のコードは、句点と読点の禁則処理を行い、句点の後ろの文字は行頭に置きます。

use Jcode;

my $str = "この文章は、禁則処理をテストしています。";

my $j = new Jcode($str);
my @result = ();
foreach my $buff ( $j->jfold($count,,["。", "、", ""]) ){
push(@result, $buff);
}

print join("\n", @result);

なお、Jcodeモジュールは、Perl 5.8.1以降で使用できます。
この回答への補足あり
    • good
    • 0
この回答へのお礼

ちょっと原因箇所が違いましたが、AIさんの答えでも合ってましたね。
ありがとうございました。

お礼日時:2023/08/30 22:06

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A