Perl Tips
Perlの小技・サンプルコード
文字列操作
日本語文字列をURLエンコードする
sub encodeURL{
my $str = shift;
$str =~ s/([^\w ])/'%'.unpack('H2', $1)/eg;
$str =~ tr/ /+/;
return $str;
}
ファイル入出力操作
ファイルを読み込む
sub readFile{
my $file = shift;
my @lines;
open (my $fh, '<', $file);
flock $fh, 2;
@lines = <$fh>;
flock $fh, 8;
close ($fh);
return @lines;
}
ファイルを書き込む
sub writeFile{
my ($file, $str) = @_;
open (my $fh, '>', $file);
flock $fh, 2;
print $fh $str;
flock $fh, 8;
close ($fh);
return $str;
}
ディレクトリ操作
ファイル名一覧取得
sub getFiles{
my $dir = shift || '.';
opendir(my $dh, $dir);
my @files = sort readdir($dh);
closedir($dh);
@files = grep(/^[^\.]/, @files);
return @files;
}
クッキー操作
クッキー情報書き込み
sub setCookie{
my ($name, $val) = @_;
my $cgi = new CGI;
my $cok = $cgi->cookie(
-name => $name,
-value => $val,
-expires => "+6M",
);
return $cok;
}
クッキー情報読み込み
sub getCookie {
my $key = shift;
my %cookie;
foreach my $xx (split(/; */, $ENV{'HTTP_COOKIE'})) {
my ($name, $value) = split(/=/, $xx);
$value =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/eg;
#$value = filter($value);
$cookie{$name} = $value;
}
return $cookie{$key};
}
配列操作
変数が配列かどうか判定
XML::Simpleで得られる値が配列でないときがある。
if(ref($items) ne 'ARRAY'){ #配列でなかったら空配列を返す
}
my $items = $xml->{Items}->{Item};
if(ref($items) ne 'ARRAY'){
return @list;
}
foreach my $item (@{$items}){
my $title = $item->{ItemAttributes}->{Title};
my $asin = $item->{ASIN};
my %hash = (
asin => $asin,
title => $title
);
push (@list, \%hash);
}
重複する要素を消す
my %count;
@tags = grep {!$count{$_}++} @tags;
ソートする
@tags = sort {$a cmp $b} @tags;
タグの配列を整理
sub convert_tags{
my $self = shift;
my $tags = shift;
my @tags = @{$tags};
# 同じ要素を数える
my %tag_count;
foreach (@tags){
$tag_count{$_}++;
}
# 重複しないユニークな要素を取り出す
my %c;
@tags = grep {!$c{$_}++} @tags;
# ハッシュ配列に
foreach(@tags){
$_ = {
name => $_,
count => $tag_count{$_},
};
}
# 名前順でソート
@tags = sort {$a->{name} cmp $b->{name}} @tags;
return @tags;
}
cvsファイルをハッシュの配列に変換する
test.csv
id,title,text
1,ああああ,あいうえお,
2,いいいい,かくくけこ,
3,うううう,さしすせそ,
出力
{
{
'id' => '1',
'title' => 'ああああ',
'text' => 'あいうえお',
},
{
'id' => '2',
'title' => 'いいいい',
'text' => 'かきくけこ',
},
{
'id' => '3',
'title' => 'うううう',
'text' => 'さしすせそ',
},
}
my @ary = csv_img('aaaa.csv');
sub csv_img{
my $csv_file = shift;
open(my $fh, '>', $csv_file) or die 'die';
my @csv = <$fh>;
close($fh);
my @ary;
my $thead = shift @csv;
my @keys = split(/,/, $thead);
foreach (@csv){
s/\r\n//g;
my @vals = split(/,/);
my %hash;
for(my $i=0; $i < $#keys; $i++){
$hash{$keys[$i]} = $vals[$i];
}
push(@ary, \%hash);
}
return @ary;
}