App-Greple
view release on metacpan or search on metacpan
RIPGREP-STUDY.md view on Meta::CPAN
å¤æã¯æ°å¦çã«ã¯æ´åçã«å®ç¾©ã§ããï¼ãªãã»ããã¯æé ã«å±ãã®ã§ 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 ã³ã¼ããæ¤ç´¢ãã¤ãã©ã¤ã³ã«ç´æ¥ä»å
¥ã§ããã
( run in 1.153 second using v1.01-cache-2.11-cpan-7fcb06a456a )