memo.xight.org

日々のメモ

カテゴリ : Perl

7ページ目 / 全7ページ

CDDB モジュール

フォーマット

  最後の 2 文字はトラック数 (0209d901 -> 1 枚の CD に 1 曲のみ)
  真中の 4 文字全体の時間 (bb11de62 -> 4574 秒)
  最初の 2 文字はチェックサム

CDDB の検索の仕組

  曲数と各曲の演奏時間をキーとして検索

Reference

CDDB

  たつをのChangeLog - 2003-08-11
  http://chalow.net/2003-08-11-2.html

CGI.pm

使用法

  use CGI;
  $data = new CGI;
  $name = $data->param('name');

MeCab の Perl モジュールの使用例


#!/usr/bin/env perl
use MeCab;
my $sentence = "太郎はこの本を二郎を見た女性に渡した.";
my @arg = ($0, "オプション");
my $c = new MeCab::Tagger (\@arg);
my $result = $c->parse($sentence);
print $result;
exit;


元の形態素と読みだけ出力したい場合 (元の形態素\t読み\n)

my @arg = ($0, qq(-F%m\t%f[7]\n));


オプション参考

  http://cl.aist-nara.ac.jp/~taku-ku/software/mecab/format.html

CPAN を利用して Perl モジュールを楽してインストールしたい

初期設定

# perl -MCPAN -e shell
Are you ready for manual configuration? [yes]


  Mirror サーバを選択するところ以外は ほとんど Return でOK

Perl モジュールインストール方法

# perl -MCPAN -e shell
cpan> install モジュール名


Reference

  ITMedia デベロッパー - Linux Tips - Perlモジュールを楽してインストールしたい
  http://www.itmedia.co.jp/help/tips/linux/l0495.html

Perlメモ

Summary

  やりたい事から逆引きできる.正規表現雑技が物凄い.

http URIの正規表現

q{\b(?:https?|shttp)://(?:(?:[-_.!~*'()a-zA-Z0-9;:&=+$,]|%[0-9A-Fa-f} .
q{][0-9A-Fa-f])*@)?(?:(?:[a-zA-Z0-9](?:[-a-zA-Z0-9]*[a-zA-Z0-9])?\.)} .
q{*[a-zA-Z](?:[-a-zA-Z0-9]*[a-zA-Z0-9])?\.?|[0-9]+\.[0-9]+\.[0-9]+\.} .
q{[0-9]+)(?::[0-9]*)?(?:/(?:[-_.!~*'()a-zA-Z0-9:@&=+$,]|%[0-9A-Fa-f]} .
q{[0-9A-Fa-f])*(?:;(?:[-_.!~*'()a-zA-Z0-9:@&=+$,]|%[0-9A-Fa-f][0-9A-} .
q{Fa-f])*)*(?:/(?:[-_.!~*'()a-zA-Z0-9:@&=+$,]|%[0-9A-Fa-f][0-9A-Fa-f} .
q{])*(?:;(?:[-_.!~*'()a-zA-Z0-9:@&=+$,]|%[0-9A-Fa-f][0-9A-Fa-f])*)*)} .
q{*)?(?:\?(?:[-_.!~*'()a-zA-Z0-9;/?:@&=+$,]|%[0-9A-Fa-f][0-9A-Fa-f])} .
q{*)?(?:#(?:[-_.!~*'()a-zA-Z0-9;/?:@&=+$,]|%[0-9A-Fa-f][0-9A-Fa-f])*} .
q{)?};

正確でないが簡単なhttp URIの正規表現

s?https?://[-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#]+


CSV形式の $line から値を取り出して @values に入れる

  (値1,値2,"値3,値3","値4""値4" → 値1 値2 値3,値3 値4"値4)
{
	my $tmp = $line;
	$tmp =~ s/(?:\x0D\x0A|[\x0D\x0A])?$/,/;
	@values = map {/^"(.*)"$/ ? scalar($_ = $1, s/""/"/g, $_) : $_}
	($tmp =~ /("[^"]*(?:""[^"]*)*"|[^,]*),/g);
}


配列 @array から重複した要素を取り除く

{
	my %count;
	@array = grep(!$count{$_}++, @array);
}


特定の項目でソートする (第 1項でソートし,さらに第 2項で降順ソートする)

@data = ('A,7,緑',
	 'C,6,青',
	 'B,4,赤',
	 'A,9,紫',
	 'A,2,黄緑',
	 'B,10,黄',
	 'C,3,青紫');
@data = map {$_->[0]}
sort {$a->[1] cmp $b->[1] or $b->[2] <=> $a->[2]}
map {[$_, split /,/]} @data;


  - ソート後のデータ
@data = ('A,9,紫',
	 'A,7,緑',
	 'A,2,黄緑',
	 'B,10,黄',
	 'B,4,赤',
	 'C,6,青',
	 'C,3,青紫');


Reference

  大崎 博基 - Perlメモ
  http://www.din.or.jp/~ohzaki/perl.htm

Getopt::Long の使用法

Getopt:Long とは

  伝統的なものや GNU や POSIX の getopt() 関数のよりよい機能性をインプリメントするもの.
  Getopt::Std は 1 文字しかオプションの文字が取れない.
  Getopt::Long は `-' や `--' , `+' で始まる 1 文字以上のオプションが取れる.

具体的な使用法

my %options = ( help  =>  0);
$ret = GetOptions(\%options,\$pattern,'help|h');
if ($options{help}){ &usage(); }


配列に入れたい場合

  最後に `@' を入れる
  ex)
$ret = GetOptions('file|f=s@',\@filelist);

  --file /where/foo --file /where/var というオプションで
  @filelist =['/where/foo','/where/var']; と同じ

引数指定子

引数指定子 引数 引数の省略 引数省略時の値 備考
<無し> --- --- オプションが指定されると,リンク先の変数が 1 になる.
! --- --- 前に`no' を付けると否定できる.ex) --nosize とか
=s 文字列 省略不可 --- 文字列の先頭が-または--で始まっていてもオプションとはみなされない.
:s 文字列 省略可能 '' 文字列の先頭が-または--で始まっている場合は次のオプションとみなされる.
=i 整数 省略不可 --- 負の値を示すために引数の先頭に-をつけることができる.
:i 整数 省略可能 0 負の値を示すために引数の先頭に-をつけることができる.
=f 実数 省略不可 --- 負の値を示すために引数の先頭に-をつけることができる.
:f 実数 省略可能 0 負の値を示すために引数の先頭に-をつけることができる.
- 補足
  %options の中にはデフォルト値を入れておく.
  $options{help} で値が取れる.

Reference

  Perl_man Getopt.3pm
  http://www.att.or.jp/perl/man/getopt.3pm.html

正規表現で変数を用いる際の注意点

問題点

  $hoge = 'hoge' という変数があった場合
  huga を ahogea と置換するために
  s/huga/a$hogea/;
  とやっても,$hogeaという変数と解釈してしまう.
  s/huga/a($hoge)a/;
  とやっても,a(hoge)aとなってしまう.

解決法

  s/huga/a${hoge}a/;
  ${変数名} は Perl だけでなく,Shellスクリプトなどでも応用が利くらしい.