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っぽくて、Linuxのgrepっぽい
%はMapやReduceというか、awkっぽい。特に-Beginや-Endっていうところが。
詳細は、Get-Helpでわかる。
> Get-Help Where-Object # ?のヘルプ > Get-Help ForEach-Object # %のヘルプ
追伸 : PowerShellにはスーパーpre記法がないみたいだ