split
應該是非常快的,除非你開始交換。我能看到加速的唯一方法是編寫一個查找LF而不是使用正則表達式的XS函數。
順便說一句,你可以通過切換節省大量的內存來
while ($$file_ref =~ /\G([^\n]*\n|[^\n]+)/g) {
my $line = $1;
# process line
}
說XS功能。如果您不想chomp,請在if
語句後移動newSVpvn_flags
行。測試它的
SV* next_line(SV* buf_sv) {
STRLEN buf_len;
const char* buf = SvPV_force(buf_sv, buf_len);
char* next_line_ptr;
char* buf_end;
SV* rv;
if (!buf_len)
return &PL_sv_undef;
next_line_ptr = buf;
buf_end = buf + buf_len;
while (next_line_ptr != buf_end && *next_line_ptr != '\n')
++next_line_ptr;
rv = newSVpvn_flags(buf, next_line_ptr-buf, SvUTF8(buf_sv) ? SVf_UTF8 : 0);
if (next_line_ptr != buf_end)
++next_line_ptr;
sv_chop(buf_sv, next_line_ptr);
return rv; /* Typemap will mortalize */
}
方式:
use strict;
use warnings;
use Inline C => <<'__EOC__';
SV* next_line(SV* buf_sv) {
...
}
__EOC__
my $s = <<'__EOI__';
foo
bar
baz
__EOI__
while (defined($_ = next_line($s))) {
print "<$_>\n";
}
'read_file'也可以讀取到一個數組:'我@lines = READ_FILE( '文件名');'當然,你還是會必須遍歷整個數組來處理每一行,所以它不會有太大的改變。 – ThisSuitIsBlackNot
@ThisSuitIsBlackNot - 我試過了;花費很長時間。 – Chap
它慢的原因是它需要通過文件尋找換行符。如果它們是固定寬度線,則可以通過文件查找字節,這應該更快。如果他們是可變長度的線條,那就沒有真正的方法。 – Oesor