-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathOneLineDefineOperator.txt
143 lines (71 loc) · 3.16 KB
/
OneLineDefineOperator.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
==============================================================
正規表現における
1行定義オペレータの提案
tonco-miyazawa 2021/12/22 公開
==============================================================
名前付き捕獲式集合の定義の書き方は現在以下のようになっている
## perl5 の書き方
(?(DEFINE)
(?<aaa> ...... )
(?<bb> ................... )
(?<cccc> .... )
(?<d> ............. )
)
## 鬼車、鬼雲 の書き方
(?<aaa> ...... ){0}
(?<bb> ................... ){0}
(?<cccc> .... ){0}
(?<d> ............. ){0}
これらを以下のように書けるようにしようというのが今回の提案である
## 1行定義オペレータの書き方
(?]<aaa> ...... )
(?]<bb> ................... )
(?]<cccc> .... )
(?]<d> ............. )
この書き方なら行頭を見れば名前付き捕獲式集合の定義だと分かるし、
書く上でも "?" を打ち込むついでに "]" を打てば良いだけだ
(?(DEFINE) ... ) のように全体を囲んでインデントで揃える必要もない
読む上ではカッコの終わりに {0} が付いているかを1行ごとに
確認する必要がなくなる
個人的には {0} は畑でよく見るカラス除けの目玉風船を思い出して
風情を感じられる良い物だが、これを毎回書きたい人は少ないはず
■ 細かい仕様について
## 量指定子の扱い
(?]<name> ... ){1,3} や (?]<name> ... )+ などと
書かれたときの対応をどうするか
## 後方参照の扱い
( ab )(?]<name> cd )( ef )\2
\2 はどのカッコを参照すべきか
※ 名前付きでないカッコも捕獲するオプションが有効の場合とする
これらは perl5 の (?(DEFINE) ... ) の挙動に合わせれば問題ないが
合わせなくても適切な変更なら問題ないだろう
■ 参考: perl5 の定義オペレータの挙動
## 1行ずつ定義してもちゃんと動く
(?(DEFINE)(?<aaa> ... ))
(?(DEFINE)(?<bb> ... ))
(?(DEFINE)(?<cccc> ... ))
## 入れ子にしてもちゃんと動く
(?(DEFINE)(?<aaa> 123 (?(DEFINE)(?<bb> 456 )) 789 ))
## 量指定子を付けてもちゃんと動く
$str = "000123123000";
$str =~ s/(?(DEFINE)(?<aaa>123)){2}(?&aaa)/<match>/;
print "$str\r\n";
結果: 000<match>123000
## 後方参照用の数字は定義の中のカッコにも割り当てられる
# 以下の場合、 "\3" は "cc" を参照する
$str = "111aacccc222";
$str =~ s/(aa)(?(DEFINE)(?<name>bb))(cc)\3/<match>/;
print "$str\r\n";
結果: 111<match>222
# 以下の場合、\2 は name のカッコを参照する
$str = "0000000000";
$str =~ s/(0)(?(DEFINE)(?<name>0))(0)\2/<match>/;
print "$str\r\n";
結果: マッチせず
※ name は捕獲することが無いので \2 は常にマッチに失敗する
■ まとめ
1行定義オペレータが実装されたら (?(DEFINE) ... ) を使う人が
激減するのではないだろうか?
..とは思うが実装する開発者さんの手間を考えると得られるメリットが
少なすぎるかも知れない
おわり