2010-10-15 27 views

Trả lời

15

Ba thay đổi:

  • Bạn sẽ phải sử dụng các e modifier để cho phép một biểu thức ở phần thay thế.
  • Để thực hiện thay thế toàn cầu , bạn nên sử dụng công cụ sửa đổi g. Đây là không phải cần thiết nếu bạn có một ngày trên mỗi dòng.
  • Bạn sử dụng $1 ở phía bên thay thế, không phải là một backreference

này nên làm việc:

$line =~ s{/(\d+)/}{'/'.($1+1).'/'}eg; 

Ngoài ra nếu regex của bạn có chứa delimiter bạn đang sử dụng (/ trong trường hợp của bạn), nó tốt hơn để chọn một dấu phân cách khác nhau ({} ở trên), bằng cách này bạn không phải thoát khỏi dấu phân cách trong regex làm cho regex của bạn sạch sẽ.

+0

tuyệt vời !, nó hoạt động - nếu bạn không phiền, bạn có thể giải thích cú pháp {} - ý tôi là có thể đạt được nó với s/chứ không phải là s { – Sekhar

+2

@OP: Tôi đã cập nhật câu trả lời của mình. 's ///' tương đương với 's {} {}', chỉ là nó sử dụng một dấu tách khác nhau và sẽ giúp bạn tránh được việc thoát khỏi '/' đó. – codaddict

+0

Mặc dù không bắt buộc, sử dụng công cụ sửa đổi 'x' để biểu thức chính quy của bạn giúp tăng khả năng đọc của chúng: s {/ (\ d +) /} {'/'. (1 đô la + 1).'/'} egx –

1

Làm thế nào về điều này?

$ cat date.txt 
9/0/2010 
9/2/2010 
10/11/2010 
$ perl chdate.pl 
9/1/2010 
9/3/2010 
10/12/2010 
$ cat chdate.pl 
use strict; 
use warnings; 

open my $fp, '<', "date.txt" or die $!; 

while (<$fp>) { 
    chomp; 
    my @arr = split (/\//, $_); 
    my $temp = $arr[1]+1; 
    print "$arr[0]/$temp/$arr[2]\n"; 
} 

close $fp; 
$ 
+0

cảm ơn vì cách tiếp cận này - Tôi sẽ tiếp tục khám phá perl - Tôi đã chấp nhận một câu trả lời khác vì nó giải quyết với một dòng – Sekhar

+0

Vâng, những câu trả lời đó chắc chắn tốt hơn, tôi cũng không biết về biểu thức. – Lazer

0

công trình này: (e là để đánh giá chuỗi thay thế: xem tài liệu perlrequick).

$line = '8/10/2010'; 
$line =~ s!/(\d+)/!('/'.($1+1).'/')!e; 

print $line; 

Nó giúp để sử dụng ! hoặc một số nhân vật khác như delimiter nếu biểu thức chính quy của bạn có / riêng của mình.


Bạn cũng có thể sử dụng, từ câu hỏi này trong Can Perl string interpolation perform any expression evaluation?

$line = '8/10/2010'; 
$line =~ s!/(\d+)/!("/@{[$1+1]}/")!e; 

print $line; 

nhưng nếu điều này là một câu hỏi bài tập về nhà, hãy sẵn sàng để giải thích khi giáo viên yêu cầu bạn làm thế nào bạn đạt được giải pháp này.

+0

Cảm ơn bạn đã đề cập đến ký tự phân cách! – Sekhar

+0

oh không không !, không phải là một câu hỏi về bài tập về nhà, tôi sẽ giải thích cho bạn - giải pháp của tôi đã làm việc nhưng tôi tự hỏi liệu có cách tiếp cận tốt hơn không. Tôi đang tạo cơ sở dữ liệu theo dõi tất cả người dùng đã sử dụng ứng dụng. Hệ thống xác thực là bên ngoài - tuy nhiên nó viết một tệp riêng biệt cho mỗi lần đăng nhập. Tôi đang cố gắng lấy thời gian đăng nhập bằng cách ghi lại thời gian tạo tệp và chèn vào định dạng SQL Server DATETIME. Chương trình perl đầu tiên của tôi mà tôi đã viết đã bỏ lỡ sự kiện quan trọng này - vì vậy hầu hết các ngày đều ở định dạng 0/0/2010 (Không tương thích với DATETIME). chạy chương trình Perl một lần nữa với những thay đổi là tốn kém – Sekhar

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