看板 Perl 關於我們 聯絡資訊
再承續這個問題 有沒有辦法像切吐司一樣 一次切一段出來用 第一次: $tmp = "|%some string1\n"; $str = "|%some string2\n|%...\n|%some string n"; 第一次: $tmp = "|%some string2\n"; $str = "|%some string3\n|%...\n|%some string n"; . . 第n次: $tmp = "|%some string n"; $str = ""; 我試著用loop去處理 while($tmp =~ m/\|%.*?(?=\|%)/s){ do something I want with $&... $tmp = $'; $count++; } print $count."\n"; 理論上是做到了.. 可是實際上效能出奇的差 主要在於 $tmp =$' 這裡是賦值運算 loop 1: $tmp = ----------------------------- ┐ loop 2: $tmp = ---------------------------- ┼ 每次$tmp都代表不同位置的記憶體 loop 3: $tmp = --------------------------- ┘ 所以筆數很大且每筆資料的字串很長時表現很糟糕 不知道有沒有什麼立即的函式能做到我想到的 如: 像C一樣, 用指標能標記每筆的開頭 那我想效能應該會大幅提升 ※ 引述《WindChris (惡靈 退散)》之銘言: : 我有一列字串 : $str = "|%some string 1\n|%some string 2\n|%...\n|%some string" : 也就是這裡頭可拆成 n 個以 |% 開頭的字串 : 想把這字串切成陣列 : 我這麼寫 @_ = ($str =~ m/|%.*?[^|][^%]/gs); : 可是string 裡有 | 這樣就破功了 : 我是有想過用split /|%/, $str : 然後再一個一個把 |% 補回去.. : 可是我處理的字串很大 存成檔案大概 20M 這樣效能會變很差 : 請教各位 像這種的 RegExp 應該長什麼樣子? : 或者根本就寫不出來呢? 只能用split? : 謝謝!! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.143.215.28 ※ 編輯: WindChris 來自: 220.143.215.28 (03/23 02:53)
Andor:s/\|%.*?(?=\|%|$)//s 或 用index加substr像C一樣做 03/23 10:29
jlovet:我覺得會很慢,是因為你對一個大字串str做regex吧 03/23 12:02