俺メモ

完全に自分用のメモです。
よく忘れるけどググると時間がかかるものをここにメモします。

### dieしたり、Ctrl+Cした時にスクリプトを終了させずにコンソール起動して変数確認したり、perlコードを試したりするプチテクニック

デバッグしていて動作がおかしいからprintfデバッグしているとアレもコレもと出力してどんどんコードが汚くなった上に時間がどんどん過ぎて言ったり、
はたまた始めてのモジュールで動作があまり良くわからず、ドキュメント片手にトライアンドエラーしながらコードを書いては、激非効率なコーディングを強いられている時にちょっとだけ便利になるかもしれないテク

テクって言っても大した事ないが、終了させずにシグナルフックしてコンソールからの入力を`eval`実行するようにしておくと、シグナル発生のタイミングの変数確認したり、perl実行したりすると便利かも

``` perl
while(1){
  $SIG{'INT'} = sub{
    print ">>";
    my $cmd = <STDIN>;
    my @rets;
    my $ret;
    my %hret;
    eval $cmd;
    say Dumper {'@rets' => \@rets, '$ret' => \$ret, '%hret' => \%hret};
  };
}
```

`die`をフックするときは

``` perl

$SIG{__DIE__}  = sub{

```


で、どう使うかというと、デバッグしたいところまでスクリプトを走らせたら`Ctrl+C`でスクリプトストップ、そうすると上記のwhileループに突入する。

あとは変数確認したいなら

`say "$hoge";`

とかすれば当然見れるし
モジュールやサブルーチンの戻り値確認をしたいときは

`@rets = some_function();`

とか入力して実行するとその後すぐに変数を`Dumper`するようにしているから確認できる。戻り値用の変数として`$ret`, `@rets`, `%href`の３パターン用意してあるからなんでも来いと。

デバッガ使えーって声もあると思うけど、デバッガじゃサブルーチンの動作は試せないから。

上記動作をモジュール化したものがcpanのどっかにあるらしいけどモジュール名忘れました。



### スライス
配列やハッシュから一部を切り出したり、複数の値を一括で設定するのにスライスが便利。だけど覚えにくい

接頭語(% or @)は欲しいデータ形式、アクセッサ－([] or {})は元データのデータ形式に合わせる、と覚える。

```
my %hash  = ( a => 10, b => 11, c => 12, d => 13);
my @array = (10, 11, 12, 13);

my @part_of_array = @array[0, 2];
# => (10, 12)

my @part_of_value = @hash{'a','c'};
# => (10, 12)

my %part_of_hash  = %hash{'a','c'};
# => (a => 10, c => 12)
```

### 正規表現チートシート
http://yoshikawaweb.com/w/wp-content/uploads/regex-cheat-sheet.pdf


### 正規表現するときの演算子オプション（一文字だから検索しにくい！）
`$str =~ m/regexp/gimosx`な感じで使う。

|修飾子| 効果                              |
|---|---|
|g| 繰り返してマッチ                              |
|i|  英字の大文字、小文字を区別しない                     |
|m| オプション-文字列を複数行として扱う。Multiple Match Mountain                          |
|o| PATTERNの評価を 1回だけにする                   |
|s| オプション-ワイルドカードのドット( . )が改行にもマッチ。Super dot mode              |
|x| オプション-拡張正規表現を使用する    

リスペクト：[Perlの正規表現の一行モード(/s)と複数行モード(/m)の覚え方](http://qiita.com/xtetsuji/items/9939143a7619956997e1)

### 肯定/否定 先読み/後読み
なんとなくは覚えてるけどややこしいから結局都度調べてる。
なので、覚え方を整理しておく

先読み／後読み自体は文字そのものにはマッチしない。
あくまで位置にマッチする。イメージとしては楔

`=` ・・・肯定マーク
`!` ・・・肯定マーク
`<` ・・・左側に検索ワードが来る

感覚的には`(?<=Arch) \w+`が一番使うのでこれだけ覚える。
下の文章を検索ケースを考えると

```
Windows XP
Windows Vista
Arch Linux
SUSE Linux
```

|type  |regex  |remarks  |
|---|---|---|
|肯定戻り読み  |(?<=Arch) \w+  |Arch Linux　のLinuxにマッチ|
|否定戻り読み  |(?<!Arch) \w+  |SUSE Linux　のLinuxにマッチ|
|肯定先読み  |\w+ (?=XP)  |Windows XP　のWindowsにマッチ   |
|否定先読み  |\w+ (?!XP)  |Windows Vista　のWindowsにマッチ   |

### 正規表現の後方参照
Perlは正規表現の中でマッチング結果を使いまわせる。
つまり `m/ここの中でマッチング結果を使える/` ということ。

正規表現の外で参照する場合は`$1`,`$2`,`$3`... を使用するが
正規表現の中で参照する場合は`/1`,`/2`,`/3`... を使用する。

具体例を示す。
以下の単語は同じフレーズが繰り返しされている。
このような単語にマッチする正規表現は以下のように書ける。


``` perl
my @words = qw(
	beriberi
	booboo
	coco
	mama
	murmur
	papa
	);

foreach(@words){
	if( m/(.+)\1/ ){ # <---正規表現内でカッコ内を参照
		print "$_ is match !!\n";
	}
}

```

``` output
beriberi is match !!
booboo is match !!
coco is match !!
mama is match !!
murmur is match !!
papa is match !!
```

さらに相対後方参照という機能もある。
`\g{-1}`, `\g{-2}`, `\g{-3}` ...
次に例を示す。

``` perl
$a99a = '([a-z])(\d)\g{-1}\g{-2}';   # matches a11a, g22g, x33x, etc.
```

### 文字コードはUTF8に統一
encode と decodeが毎度ややこしい

```
use utf8; # ソースコードがUTF8;
use Encode qw/encode decode/;
binmode STDIN,  ":utf8"; #標準出力はUTF8
binmode STDOUT, ":utf8"; #標準入力をUTF8として扱う。

open(FH, "<:utf8", $filename); # ファイルの読み込みにUTF8を指定

my $inner_str = decode('utf8', $utf8_str); #出コードだけど内部文字に変化
print encode('utf8', $inner_str); #エンコードは符号化の意味だけど、UTF8フラグが落ちる
```

### YYYY-MM-DD HH:MM:SS形式の時刻の取得/出力
```
use Time::Piece;
my $t = localtime;
my $t_str = $t->strftime('%Y-%m-%d %H:%M:%S');
print $t_str, "\n";

$t->strptime($t_str, '%Y-%m-%d %H:%M:%S');
print $t, "\n";

``` 

#### モジュールの作り方
`Object::Simple`を使って簡単に

``` MyClass.pm
package MyClass;
use strict;
use warnings FATAL => 'all';

use Object::Simple -base;

has foo => 10; # public variable and 初期化
has bar => 20; # public variable and 初期化

our $hoge = 100; # private variable
our $fuga = 200; # private variable

# コンストラクタ（なくても動く）
sub new{
    my $self = shift;
    print "$hoge, $fuga\n";
    return bless {foo => 100, bar => 200}, $self
}

sub add {
    my $self = shift;
    my ($a, $b) = @_;
    return $a + $b,"\n";
}

sub add_hoge {
    my $self = shift;
    my ($a) = @_;
    return $a + $self->{hoge},"\n";
}

1; # 重要
```

呼び出し方は

``` main.pl
#!/usr/bin/perl
use strict;
use warnings FATAL => 'all';

use FindBin;
BEGIN { unshift @INC, "$FindBin::Bin/../lib" }

use MyApp;


my $obj = MyApp->new({foo => 1, bar => 2});

$obj->add(10,20); # 3
$obj->add_hoge(30); # 130
```



#### perl流　初期値の指定方法
スカラー変数

```
sub num{
    my $num = shift || 0; 
    # ....
}
```

ハッシュ

```
sub conf{
    my $arg = {
        lang => 'perl',
        rank => 1,
        @_ # ここが決め手!           
    };
    # ...
}
```

#### サブルーチンの初期化方法いろいろ

```
func({a => 4, b => 5, c => 6});
func([7,8,9]);
func(10,11,12);
func(13);

sub func{
    my $conf = {a => 1, b => 2, c => 3};

    # ハッシュリファレンス
    $conf = {a => 1, b => 2, c => 3, %{shift(@_)}}   if(ref $_[0] eq "HASH");  # for array ref

    # 配列リファレンス、見にくいから微妙
    @{$conf}{"a", "b", "c"} = @{shift(@_)}           if(ref $_[0] eq "ARRAY"); # for array ref

    # 配列（一番使う）
    @{$conf}{"a", "b", "c"} = @_                     if(! ref $_[0] and int @_ >= 2 ); # for array

    # スカラー　１変数指定したらあとはデフォルトでOKな時に
    $conf->{a} = shift                               if(! ref $_[0] and int @_ == 1 );  # for scalara

    say Dumper $conf;

}
```


```
C:\Perl64\bin\perl.exe C:\dev\spider\spider\script\main.pl
$VAR1 = {
          'a' => 4,
          'c' => 6,
          'b' => 5
        };

$VAR1 = {
          'b' => 8,
          'a' => 7,
          'c' => 9
        };

$VAR1 = {
          'a' => 10,
          'c' => 12,
          'b' => 11
        };

$VAR1 = {
          'a' => 13,
          'c' => 3,
          'b' => 2
        };


Process finished with exit code 0
```


## インストールパッケージ

### （だいたい）必須

```
cinst -y visualstudiocode googlechrome 64 adobereader firefox filezilla dotnet4.5 openssh winscp chromium conemu wireshark srwareiron microsoft-windows-terminal lightshot powertoys peazip
```

### Bootcamp環境での3本・4本指ジェスチャーを可能にしてくれるドライバ（神）

```
choco install mac-precision-touchpad
```


### コマンド系　気分で入れる

```
cinst -y jq wget curl slack telegram nodejs brackets eclipse intellijidea-community
```