突然hddがこわれたので動作を確認できないが、
https://hannsihannsyou.blogspot.com/2020/12/perl_14.html
perl 日本語の処理3 まとめ
にある日本語処理をして日本語タグジャンプを作成した。
最新版
タグファイルの作成 helptagsが効かないので tags.shで作成 うろおぼえ
タグジャンプ
.vimrc nnoremap K :so /home/moto/myprg/tags_jump.vim<CR>
tags_jump.vim
split /home/moto/myprg/yank_file.txt
normal ggdG"0p
set fileencoding=utf-8
set fileformat=unix
wq
!/home/moto/myprg/tags_jump.pl
"ジャンプしたい文字列を選択ヤンク後C-@でジャンプ。
"戻るときは:q後リターン。
~
~
tags_jump.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の変数で受け取る
#$word = "ポインタ";
my $inputfile23 = "tags";
open my $in23, "<:utf8", Encode::encode('utf-8', $inputfile23) or die "$!";
while (my $line23 = <$in23>){
#print $line23;
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;
#引数がない場合の処理をいれたほうがいいが省略
##検索文字列のあるファイルを開き検索文字列を検索
my $vim = 'vim';
#...vimでfileを開くと同時に$kensakuを実行
#$vim $fileとスペースをいれる
my $cmd = "$vim $file -c $kensaku";
#...コマンド実行
system ($cmd);
~
~
~
~
~
0 件のコメント:
コメントを投稿