[[プログラムなどなど]]のつづき~
perl についてはこちらに移動(2016年2月21日)

#contents

*perl tips [#afa844d2]
**URIのリストから、それへのリンク付きのリストのhtmlファイルを作る 15 Jan 2009 [#c3c4c07b]

こんな感じのリスト(下)をリンク付きのリストのhtmlファイルにする~
in.txt
 http://www.kit.ac.jp/
 http://www.yahoo.co.jp/
 http://www.google.co.jp/

makelink.pl
 #!perl
 print "<html>\n";
 print "<body>\n";
 print "<ul>\n";
 while(<>){
     chop;
     print "<li><a href=\"$_\" target=\"_blank\">$_</a>\n";
 }
 print "</ul>\n";
 print "</html>\n";
 print "</body>\n";

使い方
 perl makelink.pl <in.txt >out.txt 

メールに貼り付けて Thunderbird ででも受け取ればできちゃうのですけど、Pukiwikiに貼ってもできますけど……。

**タブ区切りテキストからカラムを抜き出す 16th March 2009 [#r3f53220]
**タブ区切りテキストからカラムを抜き出す 16th March 2009 & 29th April 2016[#r3f53220]

タブ区切りテキストの「2列目」と「5列目」を抜き出す

first2and5.pl
 #!perl
 while(<>){
     chop;
     my @after = split /[\t]/;
     print "@after[1]\t@after[4]\n";
 }

@_ がなぜか上手く動かなかったので、配列名を明示することにした。


動かなかったもの↓(2009年3月16日版)
 #!perl
 while(<>){
     chop;
     split /[\t]/;
     print "@_[1]\t@_[4]\n";
 }

使い方
 perl first2and5.pl <in.txt >out.txt 

これで26めがのファイルから必要な部分が取り出せて、1めがになった。えくせる使うと簡単なようだけど、文字化けとか、ヘンなところにヘンな文字が入るとか、セーブするとヘンになっちゃうとか、エラーが起こるので、テキストのまま処理するほうが確実だったりする。



**検索語を色付けしたhtmlファイルを出力する 23 May 2009 [#s7092191]

htmlファイルを検索して、検索語を蛍光マーカーで色付けしたようなhtmlファイルを作る~
このpukiwikiで検索すると複数の検索語が色付けして表示されるのと同じようなファイルを作るものです~
原理は&lt;span&gt;タグを利用して色付けするだけ~
本体部分のコードは下のようなもの
 while( s/$keyword/1101TARGET_HERE1101/){}
 while( s/1101TARGET_HERE1101/<span style=\"background-color:$colour\"> $keyword <\/span>/){}
出力例その1 → &ref(さんぷる-coloured.html);  出力例その2 → &ref(sample-coloured.html);~
batch fileを利用して、ドラッグ&ドロップで使えるものを作ったのでご利用の方はダウンロードしてどうぞ。著作権は GNU GPL 3。こちら→ &ref(colour.zip);

おととい、某友人に、こんなのあるといいねえ、と言われて作ってみました。~
その夜、firefoxのアドオンで同様の表示が実現できるとメールで教わりました(保存はできません)
 SearchWP
 SearchBox Companion
 です。
 これを組み合わせると、
 ページ内検索で、複数検索語を色分けしてくれます。


**複数のファイルの中の文字列を置換する 03 July 2009 & 16 November 2013 [#k0976ae4]

http://d.hatena.ne.jp/odz/20061218/1166499908 に従う
 perl -pi -e 's|src="/|src"../|' * ← なぜか、上手くいかなくなった(2013年11月16日)

バックアップファイルを作れと perl が言うのと、対象となるファイルの中に
変換すべき文字列が複数あるときに対応するために、g オプションを付けたら
上手くいった~
ということで
 perl -pibak -e 's| |\t|g' *
これは、スペースひとつをタブへ変換、する~
(2013年11月16日)

** perl プログラムの頭に 21 March 2016 [#vde728c9]

 #!/usr/bin/perl

もちろん、perl が別なところにあるなら、それにする


** hash  21 March 2016 [#n61673c1]

 my %countrycode = (
      "Afghanistan" => "Afghanistan",
      "Albania" => "Albania",
      "Algeria" => "Algeria",
      "Andorra" => "Andorra",
      ……
      "VirginIslandsBritish" => "Virgin Islands, British",
      "VirginIslandsUS" => "Virgin Islands, U.S.",
      "WallisandFutuna" => "Wallis and Futuna",
      "Yemen" => "Yemen",
      "Zambia" => "Zambia",
      "Zimbabwe" => "Zimbabwe"
 );



 $nowcountry = $countrycode{VirginIslandsBritish};

で、参照できる。


** local time 21 March 2016 [#a6f1de77]

[[perlでYYYYMMDD形式の日付を得る>http://memo-off.blogspot.jp/2011/05/perlyyyymmdd.html]] を参考に(前半はそのまま)

$yyyymmdd は 20160321 のように~
$mydaymonthyear は 21 March 2016 のように~
$mon は 1月が「0」からなので注意。

 my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);  
 my $yyyymmdd = sprintf("%04d%02d%02d", $year + 1900, $mon + 1, $mday);  
 my @monthname = ( January, February, March, April, May, June, July,
		  August, September, October, November, December);
 my $mydaymonthyear = $mday . " " . $monthname[$mon] . " " .  ($year + 1900);  

** 乱数 21 March 2016 [#n3f355b3]

99999 までの自然数
  my $randomnum = int(rand(99999));


** 分割して配列に収める 21 March 2016 [#oea22f3e]

- 区切り記号はかなり自由な場合を想定
- ここでは、コンマ(.)、ピリオド(,)、セミコロン(;)、コロン(:)、タブ、改行、空白文字が1つ以上複数個も可
- 空白文字以外を空白文字に置換し、その後1文字以上の空白文字を区切りとして配列に収める
- 配列を昇順にソート ← おまけ
- 収められた個数をカウント ← おまけ

 my $inputnums = "何らかの文字列としてのデータ";
 $inputnums =~ s/,/ /g;
 $inputnums =~ s/\./ /g;
 $inputnums =~ s/;/ /g;
 $inputnums =~ s/:/ /g;
 $inputnums =~ s/\t/ /g;
 $inputnums =~ s/\n/ /g;
 $inputnums =~ s/\r/ /g;
 my @mynums = split(/ +/, $inputnums);
 @mynums = sort {$a <=> $b} @mynums; # sort small to large
 my $nummynum = @myunums;


** if 分岐 21 March 2016 [#d08d2d7d]

elsif であって、else if ではない~
else はなくてもよい

 if(条件1){
 ……
 }elsif(条件2){
 ……
 }else{
 ……
 }


** ファイルへの書き出し 21 March 2016 [#t2f1d11e]

- ファイルを開く=ファイルハンドルと結びつける
- ファイルハンドルに書く= print する、など
- ファイルを閉じる=ファイルハンドルを操作

 open(DATAFILE, ">> $myoutfile") or die("error :$!");
 (print で書く1)
 print DATAFILE $mydaymonthyear;
 (print で書く2:here document)
 print DATAFILE << 'LATEXHAED';
 内容
 LATEXHAED
 close(DATAFILE);


** here document 21 March 2016 [#j5aa5710]

そのまま、または、ほぼそのまま print する

出力先~
ここでは、DATAFILE に出力しているが、省くと STDOUT

end mark (ここでは「LATEXHAED」)
- シングルクォーテーションで囲むと、そのまま
- ダブルクォーテーションで囲むと、perl の変数が展開される
- 終りにはセミコロンを付けないので注意

 print DATAFILE << 'LATEXHAED'; ← シングルクォーテーションの例
 内容
 LATEXHAED ← セミコロンなし


** wget でデータを取得する 21 March 2016 [#y68747f8]

[[ Linux&Perl→Perlメモ→ネットワークを使う→FTPダウンロード→wgetを使う>https://staff.aist.go.jp/y.fukuyama/perl0002.html]]~
ほぼそのままですが……、pipe も使えるのです。ということで。

- 「-O -」標準出力への出力を指定
- 「-q」デバッグ情報を出力せず
- ダブルクォーテーションとシングルクォーテーションの使い分けがややこしかったのだけれども、URIを変数に入れておけば全てダブルクォーテーションでいいのかもしれない(試していません)

 open (myhtml, "wget   -q -O - 'http://hoge.hoge.jp/hoge.cgi?hoge=ho&hohe='$_ | grep -A 1 'ohoho' | tail -n 1 | " );
 my @data = <myhtml>;
 close (myhtml);


** pdf file を LaTeX で作成する 21 March 2016 [#tb80cd1a]

 chdir("$myfullpdfdir");
 system("latex $myfilename >> latexlog.log");
 system("dvipdfmx $myfilename >> dvipdfmxlog.log");

- cgiプログラムではなく、ローカルで作成するなら、system ではなく、qx でも動いた。
- ワタシの環境では、ローカルでは platex が動いたが、cgi で動かすと(Apacheが platexを使うと)「I can't find the format file `platex.fmt'!」エラーが出て使えなかった。
TeXLive(texlive.x86_64 2007-60.el6_7 など)、
Red Hat Enterprise Linux Server release 6.7 (Santiago)。


** 数字に桁区切りのコンマを追加するサブルーチン 21 & 22 March 2016 [#b4f23e93]

あまり大きな数字を扱わないので、999,999 まで。

 sub commagen {
    my $nocomma = $_[0];
    my $myup = int($nocomma/1000);
    my $mydw = $nocomma - ($myup*1000);
    my $withcomma = ","; # initialize
    if($myup>0){
	$withcomma = $myup . "," . sprintf("%03d", $mydw);
    } else {
	$withcomma = $mydw;
    }
    return $withcomma;
 }



** LaTeXで、いや〜なことをする特殊記号を LaTeX の入力に変換 21 March 2016 [#t342ff3e]

- ギリシャ文字や数式には対応していません。
- 前後に空白を入れてしまったのが気持ち悪いのだけれど……。
- \textasciitilde と \textasciicircum は上手く動かなかった。


 $username = latexsafe($username);
  
 sub latexsafe{
    my $unsafestring = $_[0];
    $unsafestring =~ s/\\/ \\textbackslash  /g;
    $unsafestring =~ s/#/ \\# /g;
    $unsafestring =~ s/\$/ \\\$ /g;
    $unsafestring =~ s/%/ \\% /g;
    $unsafestring =~ s/&/ \\& /g;
    $unsafestring =~ s/_/ \\_ /g;
    $unsafestring =~ s/{/ \\{ /g;
    $unsafestring =~ s/}/ \\} /g;
    $unsafestring =~ s/\|/ \\textbar  /g;
    $unsafestring =~ s/</ \\textless /g;
    $unsafestring =~ s/>/ \\textgreater /g;
    $unsafestring =~ s/>/ \\textgreater /g;
    $unsafestring =~ s/~/ \\~{} /g;
 #    $unsafestring =~ s/~/ \\textasciitilde /g;
    $unsafestring =~ s/\^/ \\^{} /g;
 #    $unsafestring =~ s/\^/ \\textasciicircum /g;
    return $unsafestring;
 }


|Today:&counter(today);|Yesterday:&counter(yesterday);|Total:&counter(); since 23 May 2009|

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS