or1ko's diary

日々を書きます

PowerShellでのMap、Filter、Reduce

便利なことに、短い文字がエイリアスで割り当てられてる

  • Mapは%。%自体はForEach-Objectの別名。

> # カレントフォルダ以下のファイル名一覧
> Get-ChildItem -Recurse | % { $_.FullName }
  • Filterは?。?も同じくWhere-Objectの別名

> # カレントフォルダ以下のフォルダのみを取り出す
> Get-ChildItem -Recures | ? { $_ -is [System.IO.DirectoryInfo] }
  • ReduceはMapと同じで%。

> # カレントフォルダ以下のフォルダの数を調べる
> Get-ChildItem -Recurse | ? { $_ is [System.IO.DirectoryInfo] } | % -Begin {$count=0} {$count++} -End{echo $count} 

%はpythonのreduceやHaskellのfoldと同じような引数ではないので、違うかも。下のように書けばいいのか..。

> # カレントフォルダ以下のファイルサイズの合計を調べる。(隠しファイルなどは除く)
> Get-ChildItem -Recurse | ? { $_ is [System.IO.FileInfo] } | % -Begin {$acc=0} {$acc=$_.length+$acc} -End{echo $acc} 


?はFilterっぽくて、Linuxgrepっぽい
%はMapやReduceというか、awkっぽい。特に-Beginや-Endっていうところが。

詳細は、Get-Helpでわかる。

> Get-Help Where-Object # ?のヘルプ
> Get-Help ForEach-Object # %のヘルプ

追伸 : PowerShellにはスーパーpre記法がないみたいだ