2020年12月15日火曜日

perl 日本語の処理3 まとめ

 






perlの日本語の扱いを簡単に以下に記す
参考サイト

お気楽 Perl プログラミング超入門

上サイトを自分のサイト下書きに保存
https://www.blogger.com/blog/post/preview/2922454711349700227/4959814927852290614


perl_nippongo.pl                                             


!/usr/bin/perl

package pkg1;

#厳密な構文チェックと警告表示
#strictでは、my宣言が必要で、グローバル変数が使えなくなってしまうのです。
#そのような場合は、our宣言するとグローバル変数になります
use strict;
use warnings;

#Perlゼミ
#https://tutorial.perlzemi.com/blog/20091118124667.html
#外部から入力された文字列はEncodeモジュールのdecode関数でデコードする
#     内部文字にする?

#外部へ出力する文字列はEncodeモジュールのencode関数でエンコードする
#     バイト文字列にする? 

#ソースコードはUTF-8で保存しutf8プラグマを有効にする
#つまり use utf8 と書いておけばコード上の文字列は内部文字になる?

#openやunlinkなどの関数にファイル名を指定するときは、OSのバイト文字列に
#変換して指定する必要があります。

#日本語を正規表現で扱う場合 内部文字列にしないとだめ
#ただし内部文字をそのままprintで出力するとワーニングが表示されます。
#それで encodeでバイト文字に変換する
#
#use utf8;を設定すると、
#プログラム中の文字列は内部形式の文字列として扱われます。
#プログラム中の日本語、例えば「あいうえお」を5文字と認識するようになる。
#use utf8;を設定しないと15文字と認識する(length関数の結果)
use utf8;


our $word;
our $line;
our $file;
our $kensaku;

#ただし、use utf8; で内部形式の文字列になるのはプログラム中に記述された
#文字列だけです。外部 (ファイルハンドルやコマンドライン引数など) からの
#入力された文字列は「バイト文字列」として扱われます。


#/////// 以下は参考
#バイト文字列を内部形式の文字列に変換する方法はいくつかありますが、
#まず最初にモジュール Encode の関数 enocde, decode を使う方法を説明します。
#use Encode;
#Encode::decode(バイト文字列の文字コード, バイト文字列) => 内部形式の文字列
#Encode::encode(バイト文字列の文字コード, 内部形式の文字列) => バイト文字列
#///////


#ファイルをリードオープンするとき、open の第 2 引数に
#:utf8 を指定すると、内部形式に変換された文字列を受け取る
#open に渡すファイル名はosのバイト文字列して渡す。
#open my $in, "<:utf8", encode('utf-8', $file);

#すでにオープンされているファイルハンドルの場合、関数 binmode で :utf8
#を指定すると、内部形式の文字列からバイト文字列の変換を行うことができる
#つまりprint文だけで表示できる
#binmode STDIN, ":utf8";
#binmode STDOUT, ":utf8";


#検索文字列取得をyank_file.txtから取得
use Encode;
binmode STDOUT, ":utf8";
my $inputfile = "/home/moto/myprg/yank_file.txt";
open my $in, "<:utf8", Encode::encode('utf-8', $inputfile) or die "$!";
while (<$in>){
    $word = $_;
    #print $word;
}
close $in;

#文字列最後の改行を削除
chomp($word);
#print $word;


#if ( 文字列 =~ /パターン/) もし「文字列」の中に「パターン」
#が含まれていれば (パターンマッチすれば真

#tagsから検索文字列(word)のある行を取得
#$lint = 'word  ./filename  /*word*'となる

#\s 空白文字(スペース、タブ、改行) /S 空白文字以外
#()でグループ化して$2,$3の変数で受け取る

my $inputfile23 = "tags";
open my $in23, "<:utf8", Encode::encode('utf-8', $inputfile23) or die "$!";
while (my $line23 = <$in23>){
    if ( $line23 =~ /^($word)\s(\S+)\s(\S+)/ ){
        $file = $2;
        $kensaku = $3;
        #print "if";
        #print "\n";
        #print $line23;
        #print "\n";
        #print $file;
        #print "\n";
        #print $word;
        #print "\n";
        #print $kensaku;
        #print "\n";
    }
}
close $in23;

0 件のコメント:

コメントを投稿

About

参加ユーザー

連絡フォーム

名前

メール *

メッセージ *

ページ

Featured Posts