2014年6月17日火曜日

Install GD for perl in Fedora グラフ作成用ライブラリのインストール

いろいろ試して面倒くさいことになっていたが、結局以下のコマンドで成功した。すべてスーパーユーザで実行しました。OSは64ビットだったので、x86_64を選びました。
yum install gd-devel
yum install perl-GDTextUtil.noarch
yum install perl-GDGraph.noarch
yum install gd-devel.x86_64

perl -MCPAN -e shellで、installコマンドで試したが、途中で失敗したりしました。

2014年4月4日金曜日

All about Perl's List 配列のすべて

宣言

1.既知値で初期化
    my @配列名 = (val0, val1, ..., valn);

2.空の配列
my @配列名;

メンバーにアクセス

1.代入
 初期化時のほかに、以下のように個別に代入する。
    $配列名[0] = val0;
    $配列名[1] = val1;
    ... ...
    $配列名[n] = valn;
  以下の代入方法もある。
  ($配列名[0], $配列名[1]) = (val0, val1);
2.参照
 リストに含まれる値を指定した変数に順に参照する場合
foreach my $val (@配列名){
  print "$val¥n";
}
一気にリセット
 以下のコマンドで、既存の配列をすべてクリアし、空のものにできる
    @配列名 = ();

要素数
my $length = @array;

ディレクトリ・ファイル一覧の取得

単純に現在フォルダ以下のすべてのファイル名を取得するには、以下のコードで十分です。
@files=<*>; #カレントディレクトリ内の全ファイル名を取得
現在のフォルダから再帰的にすべてのファイル・フォルダ名を取得するには、以下のコードが必要です。
use File::Find;
@directories_to_search = ('./'); #(複数の指定可
find(\&wanted, @directories_to_search);

#--------------------------------------------
#ファイルが見つかる度に呼び出される
#--------------------------------------------
sub wanted {
print $File::Find::dir, '/'; #カレントディレクトリ
print $_; #ファイル名
print "\n";

#フルパスのファイル名
#print $File::Find::name, "\n";
}
他には、以下のものもあります。

  • glob() #ディレクト名でファイルの一覧取得
  • opendir() #ファイルハンドラでファイルの一覧を取得。opendirreaddirと一緒に使う

2013年2月5日火曜日

"my" variable $data masks earlier declaration in same scope at


perl エラーと解決策です。

実行するときに以下のエラーが発生するときに、ほぼ間違いなく$nameが同じスコープ内で一回以上宣言されているからです。
 "my" variable $name masks earlier declaration in same scope at

重複した宣言を削除すれば、エラーがなくなります。

2012年10月18日木曜日

Download all Images in a URL 指定ページにあるすべての画像を自動的にダウンロード


 調子に乗って、指定ウェブアドレスのページを自動的にダウンロードの応用として、指定のページにあるすべての画像を自動的にダウンロードするプログラムを書いて見ました。
 パラメータはファイル名で、内容は一行に一URLです。
 この例では、jpgしか見ていませんが、pngやgifなどほしいフォーマットを追加すれば良いです。画像に限らず、PDFやDOCなどもっと広げることもできます。
 個々の課題については、調べるとくどい説明と分かりにくい例が一杯あり、読むだけで疲れてしまいます。よって、ここでは、タスクベース、つまり目的に応じた、独立したプログラムをまとめてみることにしました。へたくそとか、効率悪いとか言う見方もあるかもしれませんが、一応そこそこ快適に動くことは確認しました。結果オーライ!
 個々の課題の例としては、「URL文字列からファイル名だけを取り出す」や、行末の改行コードを除去する」、「ハッシュの配列の参照」、「ファイルの入出力」等等です。
 しかし、HTMLとかLWP、Fileなどのクラスってすばらしいものですね。すべて自作していたら日が暮れます。
use strict;
use HTML::LinkExtor;
use  LWP::Simple;
use File::Basename;
my $file=$ARGV[0];
my $tag;
open(IN, "$file") or die"$!";
sub getFileName{
    my $path = shift;
    my ($name, $path, $suffix) = fileparse($path, ());
    return ( $name );
}
my $out;
my $line;
while(<IN>) {
  $line = $_;
  $line =~ s/\n//;
  my $parser = HTML::LinkExtor->new(undef, $line);
  $parser->parse(get($line))->eof;
  @links = $parser->links;
  foreach $linkarray (@links) {
    my ($elt_type, %attrs) = @$linkarray;
    if (($elt_type eq 'img' || $elt_type eq 'IMG') && $attrs{'src'} =~ /\.jpg$/i) {
      $out = getFileName($attrs{'src'});
      getstore($attrs{'src'}, $out);
    }
  }
}

Download the Contents of a URL 指定ウェブアドレスのページを自動的にダウンロード


 Perlで書くと以下のように簡単に実現できます。
#!/usr/bin/perl
use strict;
use warnings;
use LWP::Simple;
my $url = 'http://example.com/example.html';
my $file = 'data.kml';
getstore($url, $file);

 メモリにダウンロードして、そこで処理したい場合、WWW::Mechanizeを使った方は便利です。
#!/usr/bin/perl
use strict;
use WWW::Mechanize;
my $url = 'example.com/example.html';
my $mech = WWW::Mechanize->new;
$mech->get($url);
WWW::Mechanizeでは、指定URLにあるすべてのリンクを階層指定して持ってくることも可能です。

2012年4月11日水曜日

Perlの学習・応用

Wikipediaによると、「Perl(パール)とは、ラリー・ウォールによって開発されたプログラミング言語である。記述の美しさよりも実用性と多様性をモットーにしており、Csedawkシェルスクリプトなど他のプログラミング言語やスクリプト言語の優れた機能を取り入れている。CGIスクリプトやシステム管理、テキスト処理などのプログラムを書くのに広く用いられている。代表的なアプリケーションMovable Typeなど。
言語処理系としてのperlはフリーソフトウェアである。Artistic LicenseおよびGPLのもとで配布されており、誰でもどちらかのライセンスを選択して利用することができる。UNIXWindowsなど多くのプラットフォーム上で動作する。」

基本的にパブリックドメイン系のものですので、ライブラリのようなものは沢山開発されています。他の言語でできることは、ほぼすべてPerlでできると考えてよいです。

記述の美しさはあまり考慮されていないのと、Unixのリソースから継承されたものが多いため、いわゆるプログラミングの初心者に分かりにくい部分も多いです。

以下は、少しでも早く入門者から卒業したい人のためのリンク集です。
とほほのperl入門:定番参考書です!
Perl講座:入門からデータベース連携など、初級から上級まで
Perl-users.jp:Perlユーザの日本サイトです。基礎知識から実践コードまで
CGI・Perl例文集:実践的なコード。コピー&ペストですぐ使える
Perl基礎入門PerlプログラミングTips:2008年までの更新ですが、基本は一緒ですので、今でも参考になります。ソースコード例が豊富で、広告が少ない。