Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
似たもの同士のPerlとPHP
Search
uzulla
November 29, 2024
Programming
1
270
似たもの同士のPerlとPHP
2024-11-30
紅白ぺぱ合戦 : ぺぱBaanGaai LT
https://connpass.com/event/329428/
uzulla
November 29, 2024
Tweet
Share
More Decks by uzulla
See All by uzulla
ALL CODE BASE ARE BELONG TO STUDY
uzulla
30
7.1k
バイブスあるコーディングで ~PHP~ 便利ツールをつくるプラクティス
uzulla
1
470
PHPer's Guide to Daemon Crafting Taming and Summoning
uzulla
2
1.8k
More Context, Better Code. 既存コードやOAS等をコンテキストとしてLLMに与える事で、よりよいコード生成を行う話
uzulla
1
190
あなたのアプリ、ログはでてますか?あるいはログをだしてますか? (Funabashi.dev用 軽量版)
uzulla
3
290
セッションのトークセッション / Traps for PHP session features in growing web apps
uzulla
2
200
Crafting a Own PHP - ウキウキ手作りミニマリストPHP
uzulla
5
2.7k
例外を投げるのをやめてみないか? あるいは受け入れてみないか? - How to use exceptions other than throwing
uzulla
6
1.3k
PHPerが ISUCONでやるべき事
uzulla
1
1.5k
Other Decks in Programming
See All in Programming
Developing Specifications - Jakarta EE: a Real World Example
ivargrimstad
0
130
flutter_kaigi_2025.pdf
kyoheig3
1
350
Querying Design System デザインシステムの意思決定を支える構造検索
ikumatadokoro
1
1.2k
r2-image-worker
yusukebe
1
170
Duke on CRaC with Jakarta EE
ivargrimstad
0
120
Module Harmony
petamoriken
2
480
Rails Girls Sapporo 2ndの裏側―準備の日々から見えた、私が得たもの / SAPPORO ENGINEER BASE #11
lemonade_37
2
180
Reactive Thinking with Signals and the new Resource API
manfredsteyer
PRO
0
110
Vueで学ぶデータ構造入門 リンクリストとキューでリアクティビティを捉える / Vue Data Structures: Linked Lists and Queues for Reactivity
konkarin
1
320
TypeScript 5.9で使えるようになった import defer でパフォーマンス最適化を実現する
bicstone
1
180
アーキテクチャと考える迷子にならない開発者テスト
irof
9
3.2k
「10分以内に機能を消せる状態」 の実現のためにやっていること
togishima
1
520
Featured
See All Featured
Stop Working from a Prison Cell
hatefulcrawdad
272
21k
The Art of Programming - Codeland 2020
erikaheidi
56
14k
Designing Experiences People Love
moore
142
24k
Side Projects
sachag
455
43k
Facilitating Awesome Meetings
lara
57
6.6k
The Cost Of JavaScript in 2023
addyosmani
55
9.3k
Building Adaptive Systems
keathley
44
2.8k
Code Reviewing Like a Champion
maltzj
527
40k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
11
940
Art, The Web, and Tiny UX
lynnandtonic
303
21k
Typedesign – Prime Four
hannesfritz
42
2.9k
Transcript
ࣅͨͷಉ࢜ͷ 1FSMͱ1)1 w ߚനͺ߹ઓͺ#BBO(BBJ-5 w IUUQTDPOOQBTTDPNFWFOU
ࣗݾհ w 1FSM.POHFSʹ1)1ͷਓɺ1)1ͷਓʹ1FSMͷਓͱ ͍ΘΕΔίϞϦͷV[VMMBͰ͢ w )BDIJPKJQNͱ͍͏QN 1FSM.POHFSͷ.FFUVQ Λओ࠵͍ͯ͠·͢ w ͱ͍͑ɺ࠷ۙΊ͖ͬΓ1FSMͷਓͱࢥΘΕͳ
͘ͳΓ·ͨ͠Ͷʜ w ͜ͷͰإ͕͍ํ Β͍͠ ͳͷͰɺനࠇ͔ͭ ͳ͍άϨʔκʔϯύʔιϯͱͯ͜͜͠ʹ͍ΔͬΆ ͍Ͱ͢
ͱ͍͏͜ͱͰʜ w 1FSMͱ1)1ͰΑ͘ࣅͯΔͷͱ͍͑ʜ
None
w ʮΈΜͳ͖ͩΖʯʮͦ͏͔ʁʁʯ w ʮ৭͕פ৭ܥʯʮʁʁʁʯ
w ਖ਼نදݱͰ͢Ͷʂʂʂ w 1)1ͷਖ਼نදݱ1$3& 1FSM$PNQBUJCMF3FHVMBS&YQSFTTJPOT w ʮޓੑ͕͋Γͦ͏ʂʂʂʯ w ࣮ࡍͦͬ͘Γʂʂ ʁ
ʮ͑ͬʯ
ΤϯδϯࣅͯΔ͕ɺΠϯλʔϑΣʔε͕ҧ͏ w 1FSM͜ΜͳϦςϥϧ ͕͋Δ $txt = "ABC"; $txt =~ s/A/a/;
print $txt; w 1)1͜ΜͳؔΛ͏ $txt = preg_replace("/A/u", "a", "ABC"); echo $txt; w *'Ҏ֎ͦͬ͘Γʂʂʂ
Ωϟϓνϟͷྫ1)1 preg_match( '| (?P<scheme> https?) # SchemeΛΩϟϓνϟ :// # "://"
(?P<host> [^/\s]+) # ϗετ໊ΛΩϟϓνϟ |x', "https://test.com/", $matches ); $scheme = $matches['scheme']; $host = $matches['host'];
Ωϟϓνϟͷྫ1FSM $input = "https://test.com"; $input =~ m{ (?<scheme> https?) #
SchemeΛΩϟϓνϟ :// # "://" (?<host> [^/\s]+) # ϗετ໊ΛΩϟϓνϟ }x; my $scheme = $+{scheme}; # ͕݁͜͜ߏΫη͔ͳʁ my $host = $+{host};
ஔͷྫ1FSM $input =~ s/abc/ do { # ͜ͷதʹίʔυ͕ॻ͚Δ my $matched
= $&; # Ωϟϓνϟͨ͠ͷΛͱΓͩ͠ uc($matched); # ॲཧΛॻ͖ɺ࠷ޙͷධՁ͕ஔޙʹ } /ge; # ʮҎԼͰ͑͑Ζʯʮ͔ͨ͠ʹʯ(ucͱ͍͏func͕͋Γ·͢) $input =~ s/(abc)/uc($1)/ge;
ஔͷྫ1)1 preg_replace_callback("/abc/", function($matches) { return strtoupper($matches[0]); }, $input); w ศརػೳɺΠϯϥΠϯจࣈྻ࿈݁Մೳͳ&WBMةݥͳͷͰফ͑·ͨ͠
# php<=5.4 ϑϥάʹeΛ͚ͭΔͱevalͰ͖ͨ $func = "strtoupper"; preg_replace("/abc/e", $func."('\\0')", $input);
දʹͯ͠ΈΔ ಛ 1FSM 1)1 جຊࢀর a a a aʢಉ͡ʣ ໊લ͖ఆٛ
(?<name>pattern) (?P<name>pattern) ໊લ͖ࢀর \k<name> \k'name' (?P=name) Ωϟϓνϟ݁Ռ $1 $2͕ࣗಈͰએݴɻ ໊લ͖ͩͱ$+{name} Ҿʹ$matchesͳͲΛࢦఆ ͢Δͱ࿈ྻ͕એݴ͞ΕΔ ࣗಈม $_ ػೳͱͯ͠ͳ͍
ͦͬ͘ΓͰ͢Ͷʂ w ਖ਼نදݱࣗମͷه๏΄΅ҰॹͳΜΑͶɺߏจɺͷग़͠ೖΕͷํ๏͕ͪΐͬ ͱҧ͏͘Β͍ɻ `preg_replace` <=> `s///` `preg_match` <=> `m///`
w Ͳ͕͖ͬͪͰ͔͢ʁ
w 1)1FS ʮͳΜ͔ʜ1FSMͷํ͕͓͠ΌΕͩͳΝʂʯ w Ұൠ௨ա1)1FS ʮ͓͠ΌΕʜʁͨͱ͑͜͏͔ʁʯ $_ = "https://example.jp"; if
(m<https?://(?<host>[^/]+)>) { print "Host: $+{host}\n"; } w 1)1FS ʮ͓͠ΌΕʂʯ
தؒ·ͱΊ w ૬ޓͰॴॴ͋Δ ʁʁʁ w ͪΐͬͱؾΛ͚Ε૬ޓͰΘ͔Γ͋͑ͦ͏ w ͔ͩΒ1FSMͱ1)1૬ੑ͕ʜྑ͍ʂʂʂ ॾઆ͋Δ w
͔͠͠ͳ͕ΒΓݴޠ͕ҧ͑ࡉ͔͍ࠩ͋Δ w 1)1FSͱ1FSM.POHFS͕͓ޓ͍ʹ͢ΕҧΘͳ͍ͨΊʹʜ
ΫΠζ͠·͠ΐ͏ʂʂ Կ൪Ḧͩ͜͡Εʁʁʁ
2ߦͷઌ಄Ϛον Regex: m/^Second/ Input: "First line\nSecond line" Result: Ϛον͋Γ A)
Perl B) PHP C) ྆ํ
͑# 1)1 ղઆ1)1σϑΥϧτͰ֤ߦͷઌ಄ʹϚον͠·͢ɻ1FSMͰσϑΥϧτͰจࣈ ྻશମͷઌ಄ʹ͔͠Ϛον͠·ͤΜɻ1FSMͰ֤ߦͷઌ಄ʹϚονͤ͞Δʹɺmϑ ϥάʢϚϧνϥΠϯϞʔυʣ͕ඞཁͰ͢ɻ
2ෳߦϚονϯά Regex: m/.+/ Input: "hello\nworld" Result: Ϛον༗Γɺൣғ "hello\nworld" A) Perl
B) PHP C) ྆ํ
͑" 1FSM ղઆ1FSMσϑΥϧτͰυοτ ͕վߦʹϚον͠·͢ɻͭ·Γɺෳߦʹ·ͨ ͕ΔจࣈྻશମʹϚον͠·͢ɻ 1)1ͰσϑΥϧτͰυοτ վߦʹϚον͠ͳ͍ͨΊɺෳߦʹ·͕ͨΔϚ ονϯάΛߦ͏ʹsϑϥάʢ1$3&@%05"--
υοτΦʔϧϞʔυʣ͕ඞཁͰɺ ςετ͕ශऑͳίʔυͰ͜͠͠ͷόάΛݟ͔͚·͢ɻ php > preg_match_all("/.+/", "hello\nworld", $m); var_dump($m); array(1) { [0]=> array(2) { [0]=> string(5) "hello" [1]=> string(5) "world" } }
2ϩάղੳύλʔϯ Regex: m/^(\d{4}-\d{2}-\d{2}).*/ Input: 2024-01-01 Error 2024-01-02 Warning Expected: 2ߦϚον
Actual: 1ߦϚον όάͷݪҼʁ A) PerlͰ/mϑϥά͕ඞཁ B) PHPͰmϑϥάΛআ͢Δඞཁ͕͋Δ C) ೖྗͷվߦίʔυ͕ҧ͏
͑" 1FSMͰNϑϥά͕ඞཁ ղઆ1FSMͰϩάϑΝΠϧղੳΛߦ͏ࡍɺ^͕֤ߦͷઌ಄ʹϚον͢ΔΑ͏ʹ͢Δʹ mϑϥάʢϚϧνϥΠϯϞʔυʣ͕ඞཁͰ͢ɺͦ͏͠ͳ͍ͱจࣈྻͷઌ಄ʹͷΈ Ϛονͯ͠͠·͍·͢ɻ 1)1ͰσϑΥϧτͰ֤ߦͷઌ಄ʹϚον͠·͢ɻ ͕ɺͦͷ͍ͤͰվߦΛߟྀ͠ͳ͍ ͰΑ͍ͱ৴͡ࠐΜͩ ࣌ʹ^$ͷ᠘ ͠͠ɺΫ
ϦςΟΧϧͳόϦσʔγϣϯϛεʹͳΔ ͕ଟ͘ɺେͷ߹\A\z จࣈྻͷઌ ಄ͱɺऴ Λ͏͖ͩͱࢲࢥ͍·͢ ॾઆ͋Δ
26OJDPEFจࣈΫϥε Regex: m/\w+/ Input: "͜Μʹͪ" Result: No Match A) Perl
B) PHP C) ྆ํ
͑$ ྆ํ ղઆ1FSMͰ\w͕σϑΥϧτͰ"4$**จࣈʹͷΈϚον͠·͢ɻ 6OJDPEFจࣈʹϚονͤ͞Δʹɺίʔυʹͯuse utf8;ϓϥάϚΛ༻͢Δ ͷඞཁ͕͋Γ·͢ɻ 1FSM.POHFSʮࢦఆ͠ͳ͍ͱ͔͋Γ͑ͳ͍ͩΖɺഅࣛʹͯ͠Δͷ͔ʯ ࢲʮŰŘŕʯ ·ͨɺ1)1ͰจࣈྻόΠφϦͱͯ͠ѻΘΕΔͷͰɺ"/\w+/u",ͱVUGϑϥ άΛ͚ͭ·͢ɻ
1)1FSʮ͜͜ʹຊޠ͜ͳ͍͠ʯ ീԦࢠࡏॅ1)1FSʮ͍͍͔ΒVΛ͚ͭͱ͚ʯ
2େจࣈখจࣈม Regex: s/(\w+)/\U$1/g Input: "hello world" Result: "HELLO WORLD" A)
Perl B) PHP C) ྆ํ
͑" 1FSM ղઆ1FSMΈࠐΈͷ\UมΛαϙʔτ͓ͯ͠Γɺਖ਼نදݱͷஔͰେจࣈม ͕ՄೳͰ͢ɻ ਖ਼نදݱͱ͍͍ͭͭɺػೳతʹਖ਼نදݱͰͳΜͰͳ͘ɺจࣈྻॲཧͰ͢ ͕ʜ \uɺจࣈ͚ͩେจࣈʹ͢Δͱ͔Ͱ͖ͯศར IFMMP)FMMP ʜͦ͏ʜ͚ͩͲͭ ͔ͬͨ͜ͱͳ͍ͳʁ
1)1Ͱಉ༷ͷมΛߦ͏ʹpreg_replace_callbackؔΛ༻ͯ͠ίʔϧ όοΫͰstrtoupperؔΛݺͼग़͢ඞཁ͕͋Γ·͢ɻ
2ޙํࢀর Regex: m/(<([a-z]+)>.*?</\2>)/ Input: "<div>content</div>" Result: Match! A) Perl B)
PHP C) ྆ํ
͑$ ྆ํ ղઆʹΑΔޙํࢀর1FSMͱ1)1ͷ྆ํͰαϙʔτ͞Ε͍ͯ·͢ɻ ͲͪΒͷݴޠͰɺΩϟϓνϟάϧʔϓͷ൪߸Λ༻ͯ͠ޙํࢀরΛߦ͏͜ͱ͕Ͱ ͖·͢ɻ ͕͢͞ʹ͜Ε͘Β͍Ͱ͖ͳ͍ͱ͓͔͍͠Ͱ͢ΑͶɻ
2ίϝϯτߏจ Regex: /(?#͜ͷ෦ίϝϯτ)abc/x Input: "abc" Result: Match! ͜Ε ͲͪΒʁ A)
Perl B) PHP C) ྆ํ
͑$ ྆ํ ղઆ༧֎͔͠Ε·ͤΜ͕ɺ1FSMͱ1)1ͷ྆ํͰαϙʔτ͞Ε͍ͯ·͢ɻ 1FSMͷํ͕ΑΓॊೈͰ͕͢ɺ·͋ͦΜͳෳࡶͳίϝϯτͤΜΖɻͦΜͳෳࡶͳ ΒɺYϑϥά͔ͭͬͯͰίϝϯτͨ͠΄͏͕͍ٓ͠ɻ
2݅ذ Regex: m/(a)?b(?(1)c|d)/ Input: "abc" Result: Match! ͜Ε ͲͪΒʁ A)
Perl B) PHP
͑$ ྆ํ ղઆ͖݅Ϛονϯά1FSMͱ1)1ͷ྆ํͰαϙʔτ͞Ε͍ͯ·͢ɻ m/(a)?b(?(1)c|d)/ ͜ͷέʔεͩͱɺB ʹΩϟϓνϟάϧʔϓ Λ͔ͭͬͯD EͷϚον݅Λ੍ޚͯ͠ ͓ΓɺBCDɺ͋Δ͍CEʹϚον͠·͢ɻ ͕ɺ1)1FSଟͬͨ͜ͱ͕ແ͍ͱࢥ͍·͢ɻ
2ᩦཉϚονϯά Regex: m/a.*b/ Input: "a" + "x" * 1000000 +
"b" Result: ελοΫෆϝϞϦෆ ૣ͘Τϥʔʹͳͬͯ͠·͏ͷʁ A) Perl B) PHP C) ࠩͳ͍
͑# 1)1 ղઆجຊతʹ1FSMͱ1)1ͷ྆ํͰɺᩦཉϚονϯάେ͖ͳೖྗͰελοΫΦ ʔόʔϑϩʔϝϞϦ੍ݶա͕ൃੜ͢ΔՄೳੑ͕͋Γ·͢ɻ ͨͩ͠ɺ1)1ͷํ͕ૣ͘ΤϥʔʹͳΔͣͰ͢ɻ ͳͥͳΒΦʔόʔϑϩʔ͢ΔΑ͏ͳίʔυେ1)1FSͷϛεͳͷͰɺͬ͞͞ͱऴ ྃͯ͠ඃΛ࠷খݶʹ͠·͢ɻ
2όοΫτϥοΩϯά Regex: m/(a|aa|aaa|aaaa|aaaaa|aaaaaa)*/ Input: "aaaaa" ... (a͕݁ߏࢁ Result: ࣦഊ(Ϛονͤͣ) ͜Ε
ͲͪΒʁ A) ͲͪΒ͔ͱ͍͑Perl B) ͲͪΒ͔ͱ͍͑PHP
͑# ͲͪΒ͔ͱ͍͑1)1 ղઆ1)11)1FSΛ৴͍ͯ͡ͳ͍ͷͰɺ΄͔ͷϓϩηεʹ໎Λ͔͚ͳ͍Α͏ ʹɺͬ͞͞ͱ༏͘͠ڧ੍ऴྃ͠·͢ɻ όοΫτϥοΩϯάͷ੍ݶQIQJOJͰௐ͢Δ͜ͱͰ͖·͢ɻ # Α͘ղΒͳ͍͚Ͳ͜ΕΛͬͨΒͳ͓ͬͨɺফ͞ͳ͍Ͱ͍ͩ͘͞ ini_set('pcre.backtrack_limit', 99999999999); (*SKIP)(*FAIL)ͷςΫ͋Γ·͕͢ɺ1)1FS͍·ͤΜ
ʁʁʁ 1FSMόοΫτϥοΩϯά੍ݶ͕ͳ͘ɺݶք·Ͱ͕ΜΓ·͢ɻ ͭ·Γ1FSM1FSM.POHFSΛա৴͍ͯ͠ΔͷͰɺ͠͠NPE@QFSM͕མͪ·͢ ݹ
͍͔͕Ͱ͔ͨ͠ʁ w ΫΠζʹͰ͖Δఔʹɺࠩେ͖͘ͳ͍Ͱ͢ΑͶʁ w ͔͠͠ɺվߦΈ͍ͨʹ୯७ͳͰڍಈ͕ࠩ͋ΔͷͰؾΛ͚ͭͳ͖Ό͍͚·ͤΜ w 1FSM؆ܿʹॻ͚ͯύϫϑϧͰ͕͢ɺ͍֮͑ͯͳ͍ͱॻ͖ʹ͍͘ॴ͕͋Γ·͢ ͠ɺϛεΔͱ00.͠·͢ɻ w 1)1γϯϓϧͰෛՙʹϑΣΠϧηʔϑ͕͋Γ·͕͢ɺίʔυखଓ͖తͰ͢
͠ɺݶք·Ͱ͍͍ͨ࣌QIQJOJͷௐ͕ඞཁͰ͢ɻ w ͱ͍͑ࠜͬ͜ࣅ͍ͯΔͷͰɺ૬ޓͰཧղ͢Δͷ͘͠ͳ͍Ͱ͠ΐ͏ʂ ɹ͓ޓ͍͔֬Ίͳ͕Β͍͖ͬͯ·͠ΐ͏ʂ w ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ