Unknown Region

プログラムでハマったエラーとその解決方法についての備忘録メモ

【Perl】便利なハッシュスライスを使いこなそう

ハッシュスライスを使うと、ハッシュから複数の値を一気に取得したり、一気に代入したりすることができて便利。

取得の場合の例:

例: demo1.pl

#!/bin/bash

my %data = ('hoge' => 'fuga', 'foo' => 'bar', 'piyo' => 'piyopiyo');
my @values = @data{'hoge', 'foo', 'piyo'};

# 確認用
foreach my $value (@values) {
  print($value."\n");
}

出力: demo1.pl

fuga
bar
piyopiyo

このプログラム[demo1.pl]では、%dataのキーが[hoge, foo, piyo]に対応する要素の値をそれぞれ順番に取り出して@valuesへ代入している

@data{}の部分は以下のように、直接指定ではなくて配列にキーの一覧を用意しておいて利用することも可能。

例: demo2.pl

#!/bin/bash

my %data = ('hoge' => 'fuga', 'foo' => 'bar', 'piyo' => 'piyopiyo');
my @keys = ('hoge', 'foo', 'piyo');
my @values = @data{@keys};

# 確認用
foreach my $value (@values) {
  print($value."\n");
}

出力: demo2.pl

fuga
bar
piyopiyo

 

代入の場合の例:

例: demo3.pl

#!/bin/bash

my @keys = ('hoge', 'foo', 'piyo');
my @values = ('fuga', 'bar', 'piyopiyo');
my %data = ();
@data{@keys} = @values;

# 確認用
foreach my $key (keys(%data)) {
  print($key.' = '.$data{$key}."\n");
}

出力: demo3.pl

foo = bar
piyo = piyopiyo
hoge = fuga

@data{}の部分は取得の場合の例と同様に、以下のように直接指定ではなくて配列にキーの一覧を用意しておいて利用することも可能。

例: demo4.pl

#!/bin/bash

my %data = ('hoge' => 'fuga', 'foo' => 'bar', 'piyo' => 'piyopiyo');
my @keys = ('hoge', 'foo', 'piyo');
my @values = @data{@keys};

# 確認用
foreach my $value (@values) {
  print($value."\n");
}

出力: demo4.pl

foo = bar
piyo = piyopiyo
hoge = fuga

 

【Perl】splitの際にエスケープされているものを含めないようにする

タイトルの通り。

例えば「,(カンマ)」の場合。

CSVファイルの1行なんかを簡易的に「,(カンマ)」でsplitしたい場合、バックスラッシュなどでエスケープされている物はsplitの対象としたくなかったりする。

その場合はsplitで正規表現を用いて、以下のようにすれば良い。

例: sample.pl

#!/bin/perl
my $str = "hoge\\,fuga,piyo";
my @array = split(/(?<!\\),/, $str);
foreach (@array) {
  print $_."\n";
}
exit;

 

出力結果: sample.pl

hoge\,fuga
piyo

実際に使う場合は考慮しなければならないことも多そうだが、割と応用は効く。

 

連絡先: plugout777★yahoo.co.jp (クローラー対策のため★を@に変更してください)