【Perl】お役立ちページあつめ
■Perl講座
http://www.envinfo.uee.kyoto-u.ac.jp/user/susaki/perl/lesson_io.htm
<ファイルオープン>
http://d.hatena.ne.jp/perlcodesample/20110212/1303702930
<ファイル分割>
■分割
start~endで分割(正解かどうかは不明)
http://okwave.jp/qa/q6450760.html
■分割2
http://chaichan.lolipop.jp/perlnote/perlnote2008-02-092.htm
■分割3
http://www003.upp.so-net.ne.jp/NAMBOKU/perl/perl034.html
■分割4
<レコード整形>
■レコード整形
http://www003.upp.so-net.ne.jp/NAMBOKU/perl/perl0395.html
ちゃんとサンプルw
■下記サンプルの実行方法
のような感じ。
■test001.v
前記事参照
■test.pl
---------
#!usr/bin/env perl
$i= 0;
while($line = <>){
$i=$i+1;
if ( $line =~ m/^\s*module/ ) {
# print $_;
print $i;
print $line;
}
# if ( $line =~ m/^\s*[A-Z0-9_]+\s+[a-z0-9]+\s*/ ) {
# if ( $line =~ m/^\s*[A-Z0-9_]+\s+[a-z0-9]+/ ) {
# if ( $line =~ m/^\s*[A-Z0-9_]+\s+[\\a-z0-9]+/ ) {
if ( $line =~ m/^\s*[A-Z0-9_]+\s+[a-z0-9\\\.\/]+/) {
print $i;
print $line;
# } elsif ( $line =~ m/^\s*[A-Z0-9_] && $line =~ m/
#
#
}
}
<実行結果>
1module HOGEMODULE ( // No space
18INST instance1 ( ); ★インスタンス直後の半角spaceありOK
19INST instance2( ); ★インスタンス直後space無(すぐ「(」)でもOK
20INST \instance3 ( ); ★\で始まってるインスタンスもヒット
21INST \insta/nce4 ( ); ★途中に/があってもヒット
22INST \insta_nce5 ( ); ★途中に_があってもヒット
23INST \insta7nce6 ( );
24INST insta.7nce7 ( ); ★途中にドット「.」があってもOK
29INST instance9 ( )
30 INST insta10 ( ); ★ INST 前にスペース(半角や、tab)ありでもOK
34 module HOGE2 ( // space x 1 ★module の前のスペース対応OK1
42 module HOGE3 ( // tab x 1 ★module の前のスペース対応OK2
48 module HOGE3 ( // tab x 1 + space x 2 ★module の前のスペース対応OK3
および、16行目の
DUMMY Instance (); ★インスタンス名の最初が大文字なのでヒットしないのを期待
にはヒットしていない。(OK)
-----------------------------
■test2.pl
・行末の「;」対応したい意図
・|| 以降は // コメント(ただし英文字のみのコメント)への対応を意図
-------------------
#!usr/bin/env perl
$i= 0;
while($line = <>){
$i=$i+1;
# if ( $line =~ m/\;/ ) {
if ( $line =~ m/$\;\s*\n/ || $line =~ m/$\;\s*\/\/(.*)/ ) {
print $i;
print $line;
}
}
<実行結果>
3input hoge ;
5output hogege;
7reg aaa ;
8reg aaa ; // hoge hoge hoge ★コメントいけてる
16DUMMY Instance ();
18INST instance1 ( );
19INST instance2( );
20INST \instance3 ( );
21INST \insta/nce4 ( );
22INST \insta_nce5 ( );
23INST \insta7nce6 ( );
24INST insta.7nce7 ( );
26instance8 ( );
30 INST insta10 ( );
36);
43 );
49 );
および、末尾でない
for (i = 0 ; i<0 ; ) {
などにはヒットしていない
----------------------
サンプル作り(9/29朝現在のもの一覧
test001.v
----------------------
module HOGEMODULE ( // No space
input hoge ;
output hogege;
reg aaa ;
reg aaa ; // hoge hoge hoge
for ( i=0 ; i<0 ; i++ ) begin
end
DUMMY Instance ();
INST instance1 ( );
INST instance2( );
INST \instance3 ( );
INST \insta/nce4 ( );
INST \insta_nce5 ( );
INST \insta7nce6 ( );
INST insta.7nce7 ( );
INST
instance8 ( );
INST instance9 ( )
INST insta10 ( );
endmodule
module HOGE2 ( // space x 1
);
endmodule
module HOGE3 ( // tab x 1
);
endmodule
module HOGE3 ( // tab x 1 + space x 2
);
endmodule
---------------------------
test.pl
--------------------------
#!usr/bin/env perl
$i = 0;
while( $line = <> ) {
$i = $i + 1;
# if ( $line =~ m/\;/ ) { ★意図)「;」を含む行にマッチ
#コメント対応版(UTF-8とか日本語はNGと考えられる→.*のところ)
if ( $line =~ m/$\;\s*\n/ || $line =~ m/$\;\s*\/\/(.*)/ ) {
#★意図)行末が;スペース\nで終わるか、
#または;スペース(or無)//英語コメント、にマッチ)
print $i:
print $line;
}
}
-------------------------
test.pl
現在やりたいことに一番ちかい内容
---------------
#!usr/bin/env perl
$i=0;
while($line = <>){
$i = $i + 1;
# if ( $line =~ m/^\s+module/ ) { +を使うと先頭のスペース無(\sが0個)にマッチしない
if ( $line =~ m/^\s*module/ ) { *を使うと先頭のスペース無(\sが0個)にもマッチ(タブ、スペース何個でも対応)
print $i ;
print $line;
}
# if ( $line =~ m/^\s*[A-Z0-9_]+/ ) {
# if ( $line =~ m/^\s*[A-Z0-9_]+/ ) {
if ( $line =~ m/^\s*[A-Z0-9_]+/ ) { #//インスタンス名の先頭に
print $i;
print $line;
}
}
--------------------------
サンプル作り 2014-09-28to29 1st ver
■perl のコードをファイルに書いて実行する方法。
テキストファイル test001.txt
に対して、perl のコード(ファイルに記述)
test.pl
を適用するには、
> perl test.pl test001.txt
例えば
test.plの中身はこんな感じ
<サンプル001>
------------------
#usr/bin/env perl (一番最初にヒットしたperlのバージョンを使用する)
while(<>) {
print $_;
}
-------------------
→これをコマンドラインで実行すると、
単純に test001.txt の内容を全部表示するだけ、
となる。
参考)
1行目に書く #~のところ
http://perldoc.jp/docs/perl/5.8.4/perlrun.pod
→他のコードの例もあるので、参考にすること。
■サンプル002
------------------
#usr/bin/env perl (一番最初にヒットしたperlのバージョンを使用する)
while( $line = <>) {
print $line;
}
-------------------
→実行結果はサンプル001と同じ。
■サンプル003
---------------------
#!usr/bin/env perl
$i=0;
while($line = <>){
$i = $i + 1;
# if ( $line =~ m/^\s+module/ ) { +を使うと先頭のスペース無(\sが0個)にマッチしない
if ( $line =~ m/^\s*module/ ) { *を使うと先頭のスペース無(\sが0個)にもマッチ(タブ、スペース何個でも対応)
print $i ;
print $line;
}
}
------------------
テキストサンプル
********************
module HOGEMODULE (
);
input afafa;
output gga;
endmodule
module HOGE2 ( ★先頭に半角スペースあり)
);
endmodule
module HOGE3 ( ★先頭にタブあり)
endmodule
******************************
■サンプルコード004
---------------
#!usr/bin/env perl
$i=0;
while($line = <>){
$i = $i + 1;
# if ( $line =~ m/^\s+module/ ) { +を使うと先頭のスペース無(\sが0個)にマッチしない
if ( $line =~ m/^\s*module/ ) { *を使うと先頭のスペース無(\sが0個)にもマッチ(タブ、スペース何個でも対応)
print $i ;
print $line;
}
# if ( $line =~ m/^\s*[A-Z0-9_]+/ ) {
# if ( $line =~ m/^\s*[A-Z0-9_]+/ ) {
if ( $line =~ m/^\s*[A-Z0-9_]+/ ) { //インスタンス名の先頭に
if ( $line =~ m/^\s*[A-Z0-9_]+/ ) {
print $i;
print $line;
}
}
--------------------------
■サンプル00
--------------------------
#!usr/bin/env perl
$i = 0;
while( $line = <> ) {
$i = $i + 1;
# if ( $line =~ m/\;/ ) { ★意図)「;」を含む行にマッチ
#コメント対応版(UTF-8とか日本語はNGと考えられる→.*のところ)
if ( $line =~ m/$\;\s*\n/ || $line =~ m/$\;\s*\/\/(.*)/ ) {
#★意図)行末が;スペース\nで終わるか、
#または;スペース(or無)//英語コメント、にマッチ)
print $i:
print $line;
}
}
-------------------------
Perl講座(http://www.envinfo.uee.kyoto-u.ac.jp/user/susaki/perl/index.html
)
→http://www.envinfo.uee.kyoto-u.ac.jp/user/susaki/perl/condition.html
■perl では
m/正規表現など/i
というので「マッチするかどうか」を調べることが
できる。
if文の条件式とかで良く使われている。
if ( $line =~ m/正規表現/i ) {
print "Match\n"; //perlでは()不要
}
→デリミタは変えられる。
例)
if ( $line =~ m{正規表現}i ) {
if ( $line =~ m#正規表現#i ) {
※ただし、正規表現の部分の中で「#」を使う時は\#としてエスケープしてやらないといけないことに注意。(p.71)
→昔よく#にしてコードを見やすくしてたなぁ。
----------------
■
cat -n ファイル名 | grep '^module' |
cat -n ファイル名 | の後に grep か perl の ^[A-Z0-9]*
であってるかな?
→インスタンス定義部は税所の文字がかならず大文字のはず。
→インスタンス定義以外で大文字(モジュール名)で始まる行は
たぶんない。
行末の「;」をうまく使えるように。
★で!
とにかくヒットさせたら、
改行されて見えないところがあっても先頭及び
-----
perlで全行を $line に取り込む方法
(正規表現page 326)ただし、「標準入力から」とある。
while (<>) {
$line .= $_;
}
ファイルからやる方法は確認しておくこと。
----
perlにおける =~ の意味を忘れたので、確認。
たとえば、先ほどのs全行取り込みにつづけて
while ($line =~ /正規表現/gs ) {
print "$3"\n;
}
とかやると、取り込んだ全行に対して繰り返し「マッチ」を実行、
してくれるらしい。
-----
全角文字列 小文字文字列
~~~~~~~~~~ ~~~~~~~~~~
module名 instance名
→ただし、instance名は小文字他「\」で始まる可能性があるので、
「小文字または \ 」にヒットするようにしておく必要あり。
文字列の置換
【vi / vim】
※がんばって編集中
【sed】
※がんばって編集中
【Awk】
<気になった点>
■「フィールド」の概念があるから使える気がする。
$1 $2 $3 .....
→ module HOGE hoge1 (
などのマッチが楽かも。
第1フィールド module
第2フィールド 大文字アルファベット
第3フィールド 小文字アルファベット or「 \ 記号」or「/記号(?)」
第4フィールド 「"("で始まる 」
とか
参考)
テキストファイルをAwkに食わせて表示するテクニック
※行番号付きにしたり、条件にあったときだけ処理(例ではマッチ行のみ行数+1)
http://basicwerk.com/blog/archives/1013
【Perl】
※がんばって編集中
【grep】
※がんばって編集中
※がんばって編集中
【Java】
※がんばって編集中
【秀丸】
※がんばって編集中
【サクラエディタ】
※がんばって編集中