Re: [問題] 點點(..)運算子兩問
※ 引述《AntaresStar ()》之銘言:
: 對一個array我們可以用@arr[1..2]這樣的方式取到subarray
: 但對一個array ref 用箭頭$arr_ptr->[1..2]這樣會只取到其中一個值
: 看不太出規律 而又不會error
: 有人知道是為什麼嗎
: 另外一個問題
: 有人知道4個點的用途嗎
: perl -e 'print 1..2' # 12
: perl -e 'print 1...2' # 12
: perl -e 'print 1....2' # (print nothing)
: perl -e 'print 0....2' # 0
: perl -e 'print 1.....2' # syntax error at -e line 1, near "....."
: 網路上查到的多半都是2點跟3點的差異 找不到4點的
: --
: ※ 發信站: 批踢踢實業坊(ptt.cc)
: ◆ From: 111.248.84.243
: ※ 編輯: AntaresStar 來自: 111.248.84.243 (10/27 21:53)
: 推 scwg: ->[ ] 的 index 不是 list context, 而是 scalar context 10/28 06:25
: → scwg: 1..2 的 scalar context 解讀和 list context 不一樣 10/28 06:25
: → scwg: e.g. $arr_ptr->[1,3,5] 相當於 $arr_ptr->[5], 不是 10/28 06:27
: → scwg: @{$arr_ptr}[1, 3, 5] 10/28 06:27
: 推 cutekid:推 scwg 解釋(Y) 10/28 09:28
: → scwg:那再推一個 xd 這個是猜的, 四個點是被拆成 0 ... .2 從 0 到 10/28 09:39
: → scwg: 0.2, 所以是一個 0. 1 ... .2 則是空的 10/28 09:39
: → scwg: 手邊沒有 perl 有編-DDEBUGGING不然應該用 -Dx 看parse tree 10/28 09:40
: 推 cutekid:哇,scwg 太強了,再推一次有關 4 個點的「猜想」 10/28 10:57
: → AntaresStar:剛剛用-10....2試了一下 0.2的猜想應該是對的 10/28 13:11
: → AntaresStar:關於第一個問題 那1..2的scalar context要怎麼解讀呢 10/28 13:13
: → AntaresStar:看來是被當成range operator了 這真是太奇怪了 XD 10/28 13:17
: 推 CindyLinz:是 flip-flop 正反器.. 至於實用情境嘛... (思) 10/28 15:02
.. 和 ... 用在 scalar 時像是「正反器」, 用起來也像是正反器,
對我這不是電子電路出身的人來說, 初看時還真不知道能怎麼用.. :Q
它的說明非常地.. 像零件...
「起初, 如果左邊是 false, 則它是 false;
如果一旦左邊變成 true 了, 則它會先變成 true, 然後開始看右邊..
(如果是『..』的話, 這一次就先仍不管右邊,
如果是『...』的話, 如果右邊現在已是 true,
則下一次會跳回起初一樣看左邊.)
繼續, 就一直觀察右邊, 如果右邊是 false, 則繼續 true 下去看右邊;
如果右邊是 true, 那這一次仍維持 true, 但下一次會變回起初狀態.
」
我覺得用起來一個自然的用法是這樣:
while(<>) {
if( /begin/ ... /end/ ) {
print $_;
}
}
那麼如果輸入內容如下
a
begin
b
c
end
e
會印出
begin
b
c
end
而 .. 和 ... 的差別在
begin xyz end
oo
end
這種, begin 和 end 出現在同一行的時候,
... 的版本會印出
begin xyz end
.. 的版本會印出
begin xyz end
oo
end
因為 .. 在 begin 的那一刻就不會去看右邊的條件, 而 ... 會.
btw, .. / ... 決定要看左邊或右邊的「狀態」, 會跨越函數呼叫,
所以可以把這東西放在一個 sub processLine {} 裡面,
然後每一行資料去呼叫它一次也會動~
然後 .. / ... 還有一個隱藏功能,
如果 .. / ... 的左邊或右邊是個「常數」的話,
它會拿這個常數去跟 $. 作 == 的比較...
($. 是目前正在讀的檔案的行號)
所以可以寫
while(<>){
if( 3 .. 5 ) {
print $_;
}
}
會印出 3~5 行~
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 112.121.80.249
推
10/28 16:06, , 1F
10/28 16:06, 1F
→
10/28 16:06, , 2F
10/28 16:06, 2F
推
10/29 12:38, , 3F
10/29 12:38, 3F
推
10/29 14:13, , 4F
10/29 14:13, 4F
推
10/30 14:50, , 5F
10/30 14:50, 5F
右邊的 true/false 在說明裡寫反了 :p
不過我猜這麼細節的部分沒有人看 XD
※ 編輯: CindyLinz 來自: 112.121.80.249 (10/31 13:55)
討論串 (同標題文章)
Perl 近期熱門文章
PTT數位生活區 即時熱門文章