2009-02-02 32 views

Trả lời

8
s/(?=..$)/:/ 

Không sử dụng đề xuất của trứng $&. perldoc perlvar:

Việc sử dụng biến này ở bất kỳ đâu trong chương trình sẽ áp đặt một hiệu suất đáng kể cho tất cả các đối sánh cụm từ thông dụng. Xem "L BUI".

+0

Như mọi khi, có nhiều cách. Có một hình phạt hiệu suất có, nhưng đó là mô hình đầu tiên mà đến tâm trí (có, tôi là một anh chàng sed độc đáo của khóa học), và nó có thể đủ nhanh trong trường hợp này, bạn không nghĩ? :) – falstro

+0

nó đã đủ nhanh .. nó là một tập lệnh thực sự nhỏ anyway ... giải pháp của ayrnieu đã làm việc quá – CheeseConQueso

+0

Vấn đề không phải là liệu nó có nhanh hay không. Vấn đề là những người mới đến không nên tham gia thói quen sử dụng $ & ngay từ đầu. – innaM

1

Bạn có thể thử này:

s/..$/:$&/ 

nó phù hợp với hai nhân vật ở phần cuối của chuỗi, và thay thế nó bằng một dấu hai chấm, và chuỗi phù hợp (ví dụ: hai ký tự).

EDIT
Cố định sed-backref cho tương đương perl.

+0

ok nhờ ... yeah tôi sẽ nói rằng nó wasnt làm việc – CheeseConQueso

+0

đẹp .. có nó là – CheeseConQueso

+0

Ok, vì vậy nó isn' t biểu thức được tối ưu hóa nhất, nhưng thật dễ hiểu và thực hiện thủ thuật, điều đó không hữu ích như thế nào (như trong downvote)? Không phải là upvoting câu trả lời tốt hơn cách SO? – falstro

-2

Các Perl tương đương với sed của & là $ &, vì vậy nó phải được: Câu trả lời

$s = s /..$/:$&/s; 
0

trứng của "công trình", nhưng regex thay inobvious của nó.

tôi sẽ hơn đi cho

s/(^.*)(..$)/$1:$2/ 

Bởi vì tôi chỉ tình yêu backrefs.

Sự quá tải của nó đối với những gì bạn đang làm, nhưng đối với tôi, nó mang tính ngữ nghĩa hơn.

+0

việc chụp đầu tiên là một chút lãng phí, tại sao không chỉ đơn giản là s /(..$)/:$ 1 /? – user55400

+0

Mặc dù phần đầu tiên thực sự dư thừa, nhưng nó dễ đọc hơn nhiều. (Ít nhất là cách tôi phân tích cú pháp regex) –

+0

+1 blixtor. @Kent: mặc dù nó không có sự khác biệt thực tế trong trường hợp này, câu trả lời ban đầu của bạn chậm hơn vì Perl sẽ cần phải quay lại hai ký tự để khớp với ".." cuối cùng. Nếu điều đó ".." là một biểu thức phức tạp hơn, ". *" Ban đầu có thể dễ dàng làm cho nó * nhiều * chậm hơn. –

9

cũng có thể sử dụng cũng .....

my $string = "1200"; 
substr $string, -2, 0, ':'; 

# $string => '12:00'; 
+0

Tôi sẽ tưởng tượng chất nền() nhanh hơn đáng kể cũng như dễ đọc hơn và trực quan hơn. –

+0

Chỉ trực quan hơn nếu bạn không biết nhiều về regex. – PEZ

+0

cái này trông trực quan ... không biết tại sao, nhưng nó tạo ra 20 ~ dòng trong tệp csv và sau đó lấy một bãi chứa và cho tôi lỗi này ... substr bên ngoài chuỗi tại ./test3 dòng 237. - đoán tốt nhất của tôi là nó chạy vào giá trị 0, xảy ra trong dữ liệu của tôi và không phải là dữ liệu xấu, chỉ ngụ ý sự kiện khác – CheeseConQueso

Các vấn đề liên quan