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;
}