Để chứng minh quan điểm của eval
và cũng ra của tò mò, tôi chạy một số te sts với mã OP so với phương pháp $regex{$1}
so với cách tiếp cận eval
.
Trước hết, dường như có ít giá trị trong việc nhồi nhét mọi mã thông báo có thể có trong biểu thức đối sánh (token|token|...)
. Perl cần phải kiểm tra đối với tất cả các thẻ cùng một lúc - điều gây tranh cãi là hiệu quả hơn bao nhiêu so với việc kiểm tra mọi mã thông báo tại một thời điểm và thực hiện thay thế bằng một giá trị mã hóa cứng.
Thứ hai, thực hiện $regex{$1}
nghĩa là khóa băm được trích xuất trên mọi kết quả phù hợp.
Dù sao, đây là một số số (chạy này trên dâu 5,12, với một file 4MB bộ 100K dòng):
- Cách tiếp cận
$regex{$1}
mất 6 giây (5 giây với/đi thay vì/g)
- cách tiếp cận
tie
mất 10 giây
- cách tiếp cận OP mất một chút dưới 1 giây (với/đi thay vì/g)
- Cách tiếp cận
eval
mất ít hơn 1 giây (nhanh hơn so với mã OP)
Đây là phương pháp eval
:
$regex{foo} = "bar";
$regex{hello} = "world";
$regex{python} = "perl";
$regex{bartender} = "barista";
$s = <<HEADER;
\$start = time;
open(F, "myfile.txt");
while (<F>) {
HEADER
foreach $key (keys %regex) {
$s .= "s/$key/$regex{$key}\/go;\n"
}
$s .= <<FOOTER;
print \$_;
}
close(F);
print STDERR "Elapsed time (eval.pl): " . (time - \$start) . "\r\n";
FOOTER
eval $s;
Nếu vẫn thất bại, hãy thử 'eval' (http://perldoc.perl.org/functions/eval.html) – Nick
@Nick, Đó là những lời khuyên tồi tệ hơn càng tốt, càng xa càng Tôi lo lắng. Làm thế nào nó có thể giúp !? – ikegami
Biến thay thế không thể ở bất kỳ đâu trong mã perl - 'eval' cung cấp cho bạn khả năng mở rộng các biến trong chuỗi và sau đó thực thi chuỗi đó dưới dạng mã perl, ví dụ: eval "s/$ key/$ regex {$ key}/g" – Nick