App-Greple
view release on metacpan or search on metacpan
RIPGREP-STUDY.md view on Meta::CPAN
| ã³ãã³ã | æé |
|---|---:|
| `rg -c <ããã0ä»¶> tree/`ï¼ä¸¦åï¼ | 0.034s |
| `rg -j1 -c <ããã0ä»¶> tree/`ï¼åä¸ã¹ã¬ããï¼ | 0.036s |
| `rg -l é«é tree/`ï¼å
¨ãã¡ã¤ã«ãããï¼ | 0.047s |
| `greple -Mdig -c <ããã0ä»¶> --dig tree` | **0.88s** |
| `greple -Mdig -c é«é --dig tree` | **1.6s** |
**ããªãã£ã«ã¿å¹æï¼3000 ãã¡ã¤ã«ä¸ 5 ãã¡ã¤ã«ã®ã¿ã«ãããããå¸å°ãã¿ã¼ã³ï¼**
| ã³ãã³ã | æé |
|---|---:|
| `greple -Mdig -l zebra --dig tree` | 0.30s |
| `rg -l zebra tree/ \| greple --readlist -l zebra` | **0.058s** |
### 2.3 ããã«ããã¯ã®åè§£
ä¸ã®æ°å¤ãã greple ã® 1 å®è¡ãããã®ã³ã¹ãå
訳ãåè§£ã§ããã
| ãã§ã¼ãº | 宿¸¬å¤ | åè |
|---|---|---|
| èµ·åï¼ã¢ã¸ã¥ã¼ã«ãã¼ãã»ãªãã·ã§ã³å¦çï¼ | 44ms | Getopt::EX çãã©ã®æ¹å¼ã§ãæ®ãä¸é |
| ãã³ã¼ã + æ£è¦è¡¨ç¾ã¹ãã£ã³ | ç´ 80ms / 26MB | ããã 0 ä»¶æ 0.124s â èµ·å 44ms |
| **ãããå¾å¦ç**ï¼Match/Block æ§ç¯ã»é åæ¼ç®ã»ã«ã¦ã³ãï¼ | **ç´ 7µs / ããã** | 10 ä¸ãããã§ 0.7ã0.9sã**æ¯é
çã³ã¹ã** |
| ãã¡ã¤ã«ãã¨ã®ãªã¼ãã¼ããã | ç´ 0.25ms / ãã¡ã¤ã« | openã»binmodeã»slurp ç |
**嫿**: rg ã 26MB ã 10ms ã§èµ°æ»ããã®ã«å¯¾ã greple ã®ã¹ãã£ã³ãã§ã¼ãºã¯ 80ms â 差㯠8 åã ã
絶対å¤ã¯å°ãããããããå¤ãå ´åã® 0.8ã1.0s ã®å¤§åã¯ã¹ãã£ã³ã§ã¯ãªã
**ãããå¾ã® Perl å´å¦ç**ã§ãããããã¯åæãããåæãå¤é¨åãã¦ãæ¶ããªãã
ã¤ã¾ããrg ã«ä½ç½®ãåºããããæ¹å¼ã®çè«ä¸ã®æ¹åä¸éã¯ããã®ã¯ã¼ã¯ãã¼ãã§ã¯ 1 å²ç¨åº¦ãããªãã
## 3. ripgrep å´ã®äºå®ç¢ºèª
### 3.1 `--json` åºåï¼å®æ¸¬ç¢ºèªæ¸ã¿ï¼
```json
{"type":"match","data":{"path":{"text":"sample.txt"},
"lines":{"text":"foo é«é bar\n"},"line_number":1,"absolute_offset":0,
"submatches":[{"match":{"text":"é«é"},"start":4,"end":10}]}}
```
- `absolute_offset` ã¯è¡é ã®çµ¶å¯¾ãã¤ããªãã»ããã`submatches` ã® `start/end` ã¯è¡å
ãã¤ããªãã»ããã
- **ãã©ã³ã¹ã³ã¼ãæï¼`-E euc-jp` ã BOM æ¤åºæï¼ã®ãªãã»ããã¯ãå¤æå¾ UTF-8 ãã¤ãååºæº**
ï¼EUC-JP ãã¡ã¤ã«ã§å®æ¸¬ç¢ºèª: `é«é` â start:4, end:10 = UTF-8 ãã¤ãä½ç½®ï¼ã
`--pre` ãã£ã«ã¿ãè§£åãåæ§ã«å¤æå¾åºæºã
- é UTF-8 ãã¼ã¿ã¯ base64ï¼`bytes` ãã¼ï¼ã§è¡¨ç¾ãããã
ãããã£ã¦ãrg ã®åºããªãã»ããã¯å¸¸ã« UTF-8 ãã¤ãåä½ãã¨ã¿ãªããgreple ã®æåãªãã»ããã¸ã®
å¤æã¯æ°å¦çã«ã¯æ´åçã«å®ç¾©ã§ããï¼ãªãã»ããã¯æé ã«å±ãã®ã§ O(N) ã®ä¸åèµ°æ»ã§å¤æå¯è½ï¼ã
**ä½ç½®å¤æãã®ãã®ã¯æè¡çé害ã§ã¯ãªã**ãéå®³ã¯æ¬¡ç¯ä»¥éã§è¿°ã¹ãã³ã¹ãæ§é ã«ããã
### 3.2 æ¡ B ã®å®æ¸¬: JSON çµç±ã®ãªã¼ãã¼ããã
| å¦ç | æé |
|---|---:|
| `rg --json fox corpus.txt`ï¼96k ããããJSON 26MB åºåï¼ | 0.09s |
| âã Perl (JSON::PP) ã§ãã¼ã¹ | **8.0s** |
| ï¼åèï¼ç¾è¡ greple ã®åæ¤ç´¢å
¨ä½ | 0.82s |
ããã夿°æãJSON ã®ãã¼ã¹ã ãã§ç¾è¡ greple ã® 10 åã®æéããããï¼ã³ã¢ ã¢ã¸ã¥ã¼ã« JSON::PP ã®å ´åã
JSON::XS ã追å ä¾åã«ããã°æ°ç¾ ms ç¨åº¦ã¾ã§ç¸®ãããããã§ã byteâchar 夿ã»
ãããã¯æ§ç¯ãå ããã¨ç¾è¡ã¨ã®å·®ã¯ã»ã¼æ¶ããï¼ã
ãããå°æ°æã¯ããããã¹ãã£ã³ãã§ã¼ãºï¼80msï¼ããåããªãã**ã©ã¡ãã®ã±ã¼ã¹ã§ãå²ã«åããªãã**
### 3.3 libripgrepï¼grep cratesï¼
ripgrep 㯠`grep-matcher` / `grep-searcher` / `grep-printer` çã®ã¯ã¬ã¼ã群ã«åå²ããã¦ãã
ï¼[libripgrep PR #1017](https://github.com/BurntSushi/ripgrep/pull/1017)ï¼ã
ã©ã¤ãã©ãªã¨ãã¦åå©ç¨å¯è½ãæ£è¦è¡¨ç¾ã¨ã³ã¸ã³ã¯ Rust regexï¼æéãªã¼ãããã³ + SIMDï¼ã¨
PCRE2ï¼`--pcre2` / `-P`ãå¾èªã¿ã»å¾æ¹åç
§å¯¾å¿ï¼ã® 2 系統ã
- Rust regex ã¯å¾èªã¿ã»å¾æ¹åç
§ã»`(?{...})` é対å¿ãgreple ã¦ã¼ã¶ã¼ã®ãã¿ã¼ã³è³ç£ã¨ã¯æ¹è¨å·®ãããã
- PCRE2 ã¢ã¼ã㯠Perl ã«ããªãè¿ãããå®å
¨äºæã§ã¯ãªãã
## 4. åæ¡ã®è©³ç´°æ¤è¨
### æ¡ A: rg ããã¡ã¤ã«ã¬ãã«ã®ããªãã£ã«ã¿ã«ä½¿ã ãæ¨å¥¨ã
**ä»çµã¿**: `rg -l pattern dir` ã§ãããããå«ããã¡ã¤ã«ä¸è¦§ãã ãã rg ã«é«éåæããã
greple ã¯è©²å½ãã¡ã¤ã«ã®ã¿ã徿¥ã©ããå¦çãããä½ç½®æ
å ±ãåãæ¸¡ããªãã®ã§
ãã¤ã/æåãªãã»ããåé¡ã»æ£è¦è¡¨ç¾æ¹è¨åé¡ã®å½±é¿ãæå°åã§ããã
```
rg -l --null pattern dir | greple --readlist pattern
```
æ¢åæ©æ§ãã»ã¼ãã®ã¾ã¾ä½¿ãã:
- `--readlist`ï¼`script/greple:1200-1201`ï¼: STDIN ãããã¡ã¤ã«ãªã¹ããåãåã
- `find.pm` ã® `!command` æ©æ§ï¼`find.pm:80`ï¼: ä»»æã³ãã³ãã§ãã¡ã¤ã«ãªã¹ããçæ
ï¼`dig.pm` ã find ã®èãã©ããã§ããã®ã¨åãæ§å³ã§ã`App::Greple::rg` ã¢ã¸ã¥ã¼ã«ãæ¸ããï¼
**å®è£
æ¡**: `App::Greple::rg` ã¢ã¸ã¥ã¼ã«ãæ°è¨ãã`greple -Mrg --rg <dir> pattern` ã§
1. greple ã®ãªãã·ã§ã³å¦çå¾ãæ¤ç´¢ãã¿ã¼ã³ãåå¾
2. ãã¿ã¼ã³ã rg ã«æ¸¡ãããå¤å®ï¼é¢æ°ãã¿ã¼ã³ `&func` ã Perl åºææ©è½ã¯ä¸å¯ï¼
3. 渡ããå ´å `rg -lP --sort path` ã§ãã¡ã¤ã«ãªã¹ãçæï¼`-P` ã§ PCRE2 = Perl æ¹è¨ã«æ¥è¿ã
`--sort` ã¯ä¸¦åæ§ã殺ãã®ã§åºåé ãåé¡ã«ãªãå ´åã®ã¿ï¼
4. 渡ããªãå ´å㯠`rg --files`ï¼ãã¡ã¤ã«åæã®ã¿ï¼ã«ãã©ã¼ã«ãã㯠â ããã§ã
.gitignore å°éã»ãã¤ããªã¹ãããã®æ©æµã¯ãã
**æ£ããã®æ¡ä»¶**: ããªãã£ã«ã¿ã¯ãgreple ãããããããã¡ã¤ã«ã®ä¸ä½éåããè¿ãå¿
è¦ãããã
注æç¹ã¨å¯¾ç:
| æ¸å¿µ | 対ç |
|---|---|
| æ£è¦è¡¨ç¾æ¹è¨å·®ï¼å¾èªã¿çï¼ | `-P` (PCRE2) ã使ãã夿ä¸è½ãªãç´ éããã©ã¼ã«ãã㯠|
| è¡è·¨ããã¿ã¼ã³ | `rg -U`ï¼ãã«ãã©ã¤ã³ï¼ãä»ãã |
| é UTF-8 ãã¡ã¤ã«ï¼--icodeï¼ | `rg -E <encoding>` ã«ãããã³ã°ãguess æã¯ç´ éã |
| `--if` ãã£ã«ã¿å¯¾è±¡ï¼zip çï¼ | rg ã§ã¯å¤å®ä¸è½ â ç´ éãï¼å¾æ¥ã©ãã greple ãå¦çï¼ |
| 大æåå°æå (`-i`) | `rg -i` ãé£å |
| must/need ã®è¤æ°ãã¿ã¼ã³ | å齿§ãã¿ã¼ã³ã® OR ã§ `-e` ã並ã¹ãã°ä¸ä½éåã«ãªã |
å®å
¨å´ã«åãï¼è¿·ã£ããç´ éãï¼è¨è¨ãªãçµæã®æ£ããã¯ä¿ãããæ§è½ã ããæ®µéçã«åä¸ããã
**广**: ããããçãªå¤§è¦æ¨¡ããªã¼ã§æ¯é
çãªããããããªããã¡ã¤ã«ã®å¦çãã rg ã®é度
ï¼ä¸¦åèµ°æ» + .gitignore/ãã¤ããªã¹ãããï¼ã§æ¶ããã宿¸¬ 3000 ãã¡ã¤ã«ã§ 5 åã
å®ããã¸ã§ã¯ãã®å·¨å¤§ããªã¼ã§ã¯æ¡éãã«ãªããgreple ã®ä¸»ç¨éï¼ããã¥ã¡ã³ãã»ã³ã¼ãæ¤ç´¢ï¼ã§
æã使ã大ããã®ã¯ãã®ã±ã¼ã¹ã
**å¾å¤±ã¾ã¨ã**: å·¥æ°å°ï¼ã¢ã¸ã¥ã¼ã« 1 åãã³ã¢å¤æ´ã»ã¼ä¸è¦ï¼ãrg ã¯ãªãã·ã§ãã«ãªå¤é¨ä¾å
ï¼ç¡ããã°å¾æ¥åä½ï¼ãgreple ã®æ©è½ã»ã¢ã¸ã¥ã¼ã«äºææ§ã¸ã®å½±é¿ã¼ãã
åä¸å·¨å¤§ãã¡ã¤ã«ã»ããã夿°ã®ã±ã¼ã¹ã«ã¯å¹ããªãï¼â æ¡ E ã§è£å®ï¼ã
### æ¡ B: rg --json ã®ä½ç½®æ
å ±ã greple å
é¨ä½ç½®ã«å¤æãã ã鿍奍ã
ã¦ã¼ã¶ã¼ã以忤è¨ããæ¹å¼ãæè¡çã«ã¯ §3.1 ã®ã¨ãããrg ã®ãªãã»ããã¯å¤æå¾ UTF-8 ãã¤ãåºæºã
ãªã®ã§ãæé ãªãã»ããã 1 ãã¹ã§æåä½ç½®ã«å¤æããã° greple ã®å
é¨è¡¨ç¾ã«è¼ãããã¨èªä½ã¯å¯è½ã
ããã:
1. **æ¹åä¸éãå°ãã**: åããã®ã¯ã¹ãã£ã³ãã§ã¼ãºï¼26MB ããã ~80msï¼ã®ã¿ã
ãããå¾å¦çï¼æ¯é
çã³ã¹ãï¼ã¯ greple å´ã«æ®ãã
2. **JSON ãªã¼ãã¼ããããé广**: ããã夿°æãJSON::PP ã§ãã¼ã¹ã« 8 ç§ï¼å®æ¸¬ï¼ã
JSON::XS ãä¾åã«å ãã¦ãå¤æã»æ§ç¯ã³ã¹ãã§å©å¾ã¯ã»ã¼ç¸æ®ºã
3. **æ©è½å¶ç´ãå¤ã**: 颿°ãã¿ã¼ã³ï¼`&func`ï¼ä¸å¯ã`--inside/--outside` ã®é åãã¿ã¼ã³ã
åæ§ã«å¤é¨åããªãã¨çæè½ã¡ã`--if` ãã£ã«ã¿ã¨ã®åæãæ£è¦è¡¨ç¾æ¹è¨å·®ã
ããã 0 å¹
ã»éãªãé åã®ã»ãã³ãã£ã¯ã¹å·®ãçã®äºææ§ç©´ã夿°ã
4. 表示ã®ããã©ã®ã¿ã¡è©²å½ãã¡ã¤ã«ã®ãã³ã¼ã㨠slurp ã¯å¿
è¦ã§ãI/O é¢ã®ç¯ç´ããªãã
**çµè«**: å®è£
ãã¦ãç¾è¡æ¯ã§ã»ã¼éããªãããäºææ§ãªã¹ã¯ã ãå¢ããã
### æ¡ C: Rust ã©ã¤ãã©ãª (grep crates) ã FFI::Platypus ã§å¼ã¶ ã鿍奍ã
**æè¡çæç«æ§ã¯ç¢ºèªã§ãã**:
[FFI::Platypus::Lang::Rust](https://metacpan.org/pod/FFI::Platypus::Lang::Rust)ï¼0.17, 2023ï¼ã¨
[FFI::Build::File::Cargo](https://metacpan.org/pod/FFI::Build::File::Cargo) ã«ããã
CPAN ãã£ã¹ããªãã¥ã¼ã·ã§ã³ã« Rust ã¯ã¬ã¼ãã忢±ã `cargo` ã§ãã«ãããä»çµã¿ã¯ç¢ºç«ãã¦ããã
in-process ãªã®ã§ JSON ãªã¼ãã¼ãããã¯ãªããbyteâchar 夿ãã¼ãã«ã Rust å´ã§æ§ç¯ããçã®
èªç±åº¦ãé«ãã
ããã:
1. **å¹æã¯æ¡ B ã¨åãå ´æã«éå®ããã**: åæãããåæã®é«éåã®ã¿ãæ¬æ°ã§éãããã«ã¯
é å代æ°ï¼Regions.pmï¼ã¨ãããã¯æ§ç¯ï¼Grep.pmï¼ã㨠Rust ã«ç§»ãå¿
è¦ãããããããªãã¨
颿°ãã¿ã¼ã³ã `--postgrep` çã® Perl ã³ã¼ã«ããã¯ã¨ã®å¾å¾©ãçºçãã¦è¨è¨ãè¤éåããã
2. **é
å¸ã³ã¹ããè·³ãä¸ãã**: ã¤ã³ã¹ãã¼ã«ã« Rust toolchain ãå¿
è¦ã«ãªãã
`cpanm App::Greple` ã§å
¥ãæè»½ãã失ãããï¼Alien åãäºåãã«ããã¤ããªé
å¸ã¯ä¿å®è² è·å¤§ï¼ã
ãªãã·ã§ãã« XS çãªäºæ®µæ§ãï¼ããã°ä½¿ãï¼ã¯äºéå®è£
ã®ä¿å®ãæå³ããã
3. PerlâRust å¢çã§ã®æååã³ãã¼ï¼26MB ç´ï¼ãç¡è¦ã§ããªãã
**çµè«**: ãå·¥æ°å¤§ã»å©å¾å°ã»é
å¸ãªã¹ã¯å¤§ããgreple ã®è¦æ¨¡ã®ãã¼ã«ã«å¯¾ãã¦å²ã«åããªãã
### æ¡ D: greple å
¨ä½ã Rust ã§æ¸ãç´ã ãgreple ã¨ãã¦ã¯éæ¨å¥¨ã
æè¡çã«ã¯å¯è½ã§ãæ§è½ã¯æ¬ç©ã«ãªãï¼ãããå¾å¦çãå«ã 10ã100 åç´ï¼ã
åé¡ã¯ã¦ã¼ã¶ã¼èªèã®ã¨ãã **Perl ã¢ã¸ã¥ã¼ã«ã¨ã³ã·ã¹ãã **ã«ããã
greple ã®ä¾¡å¤ã®ä¸æ ¸ã¯ `-Mdig`, `-Msubst`, `-Mmd`, `~/.greplerc`, Getopt::EX ã®
ãªãã·ã§ã³å±éæ©æ§ã§ããããããã¯ãPerl ã³ã¼ããæ¤ç´¢ãã¤ãã©ã¤ã³ã«ç´æ¥ä»å
¥ã§ããã
ãã¨ï¼`$_` ã«ããã¹ãã`[from,to]` ãè¿ã颿°ã`__DATA__` ã®ãªãã·ã§ã³å®ç¾©ã`__PERL__` ç¯ï¼
ã«ä¾åãã¦ãããäºæãä¿ã¤é¸æè¢ã¯:
| æ¹å¼ | è©ä¾¡ |
|---|---|
| (a) Rust ã« Perl ãåãè¾¼ãï¼libperl / [RuPerl](https://lib.rs/crates/ruperl)ï¼ | å®é¨çã»ãã«ãææªç´ãã¢ã¸ã¥ã¼ã«å®è¡é¨åã¯çµå± Perl é度ãGetopt::EX äºæã®ããã»ã¼ãã« Perl ãè¦ã |
| (b) ã¢ã¸ã¥ã¼ã«ãå¥ããã»ã¹ Perl ã§åãã IPCï¼é åãªã¹ããå¾å¾©ï¼ | è¨è¨ã¨ãã¦ã¯æãçãè¯ãããGetopt::EX ç¸å½ã®åå®è£
+ ãããã³ã«è¨è¨ã§æ°äººæç´ã26MB ç´ããã¹ãã®å¾å¾©ã³ã¹ããç...
| (c) ã¢ã¸ã¥ã¼ã«ã Rust ã§æ¸ãç´ã | ã¦ã¼ã¶ã¼èªèã©ããéç¾å®çããµã¼ããã¼ãã£ã»å人è¨å®è³ç£ãåãæ¨ã¦ããã¨ã«ãªã |
ããã« Getopt::EX èªä½ï¼ãªãã·ã§ã³å±éãautoloadã.greplerc è§£éï¼ã®åç¾ãå¿
è¦ã§ã
ãgreple äºæã® Rust çãã¯å®è³ªãã«ã¹ã¯ã©ããã®å¤§è¦æ¨¡ããã¸ã§ã¯ãã«ãªãã
**çµè«**: greple ã®å¾ç¶ã¨ãã¦ãããªããäºææ§ãæ¨ã¦ãæ°ãã¼ã«ãã¨ãã¦è¨è¨ãã¹ãã§ã
ããã¯æ¬è³æã®ã¹ã³ã¼ãï¼greple ã®é«éåï¼ã¨ã¯å¥ã®å¤æãç¾è¡ã¦ã¼ã¶ã¼è³ç£ãå®ããªãé¸ã°ãªãã
### æ¡ E: Perl å
é¨ã®æ¹å ãä½µç¨æ¨å¥¨ã
ripgrep ã¨ã¯ç¬ç«ã«ã宿¸¬ã§è¦ããããã«ããã¯ã¸ã®ç´æ¥å¯¾å¦ã
- **E1: ãã¡ã¤ã«ä¸¦åå**ï¼å¹æ: ã³ã¢æ°åãå·¥æ°: ä¸ï¼
ãã¡ã¤ã«ã«ã¼ãï¼`script/greple:1119-1162`ï¼ã¯åãã¡ã¤ã«ç¬ç«ãªã®ã§ã
fork ãã¼ã¹ï¼MCE çããããã¯èªå fork + åºåé åºå¶å¾¡ï¼ã§ä¸¦ååã§ããã
rg -j1 㨠rgï¼ä¸¦åï¼ã®å·®ã示ãã¨ãããå¤ãã¡ã¤ã«æã®ä¸¦ååã¯ç¢ºå®ã«å¹ãã
æ¡ A ã¨ç´äº¤ãªã®ã§ä½µç¨å¯è½ã
- **E2: ãããå¾å¦çã®æé©å**ï¼å¹æ: ããã夿°æã«å¤§ãå·¥æ°: å°ãä¸ï¼
( run in 0.523 second using v1.01-cache-2.11-cpan-6aa56a78535 )