memo.xight.org

日々のメモ

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