【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

 

■下記サンプルの実行方法

> perl perl.pl test001.v

のような感じ。

 

■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;

#perlコメントアウトは #

# 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;

#perlコメントアウトは #

# 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;

#perlコメントアウトは #

# 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での複数条件の指定の仕方

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 ファイル名 | の後に grepperl の ^[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 .....

perlgrepではあまり見た記憶がない

→ module HOGE hoge1 (
 などのマッチが楽かも。

 第1フィールド module
 第2フィールド 大文字アルファベット 
 第3フィールド 小文字アルファベット or「 \ 記号」or「/記号(?)」
 第4フィールド 「"("で始まる 」
とか

参考)
テキストファイルをAwkに食わせて表示するテクニック
※行番号付きにしたり、条件にあったときだけ処理(例ではマッチ行のみ行数+1)
http://basicwerk.com/blog/archives/1013

 

 

Perl

※がんばって編集中

 


grep

※がんばって編集中

 

 

【egrep】GNU egrep(拡張 grep

 ※がんばって編集中

 

 

Java】 

※がんばって編集中

 

 

秀丸

※がんばって編集中

 

 

サクラエディタ

※がんばって編集中