2010-02-06 23 views
5

Tôi có đoạn mã sau:Tại sao Perl thay chuỗi của tôi bằng "1"?

#$domain = domainname.co.uk 
#$root = public_html 
#$webpage = domainname.co.uk/foo/bar/foobar.html 
my $string = ($webpage =~ s/^$domain//g); 
my $linkFromRoot = $dbh->quote($root . $string); 

Thông thường này hoạt động tốt nhưng đối với một số lý do đầu ra là "public_html 1" thay vì "public_html/foo/bar/foobar.html".

Có ai có thể xem tại sao không?

+5

Khi bạn gặp phải các sự cố này, hãy bắt đầu chia mã của bạn để tìm nơi dữ liệu vấn đề xuất hiện. Trong trường hợp này, bạn sẽ kiểm tra giá trị của '$ string' trước khi bạn sử dụng nó, tìm ra rằng đó là' 1', sau đó đọc lên toán tử thay thế để xem nó đang làm gì. :) –

+1

Off-topic một lần nữa, nhưng tại sao DBI 'quote' thay vì placeholders? :) – hobbs

Trả lời

11

Bạn không nhận được câu trả lời đúng vì thay trả về cho bạn 1 mà là số lượng các mặt hàng thay thế. Xem câu trả lời perlfaq4 's để How can I count the number of occurrences of a substring within a string?

$domain = "domainname.co.uk"; 
$root = "public_html"; 
$webpage = "domainname.co.uk/foo/bar/foobar.html"; 
my $string = ($webpage =~ s/^$domain//g); 
print $string."\n"; 

Tháo $string và chỉ làm $webpage =~ s/^$domain//g; và sau đó làm chuỗi nối với $webpage.

0

Làm thế nào về

$webpage =~ s/^$domain//g; 
my $linkFromRoot = $dbh->quote($root . $webpage); 
7

Tôi nghĩ bạn đang giả định rằng các dấu ngoặc đơn xung quanh cụm từ thông dụng tạo ra ngữ cảnh danh sách trên đó. Rằng nó không trường hợp. Phần bên trái của toán tử gán xác định ngữ cảnh, và nó là vô hướng. Trong ngữ cảnh vô hướng, s /// trả về số lần thay thế thành công. Đặt các dấu ngoặc đơn xung quanh biến biến được khai báo làm cho nó làm những gì bạn muốn nó làm, bởi vì nó làm cho một ngữ cảnh danh sách.

này:

my ($string) = $webpage =~ s/^$domain//; 

Would return các trận đấu một phần của $ trang web: tên miền. Điều này có lẽ không phải là những gì bạn muốn. Bạn có thể muốn mã S.Mark của:

$webpage =~ s/^$domain//; 
my $linkFromRoot = $dbh->quote($root . $webpage); 

Hoặc này

my ($string) = $webpage =~ /^$domain(.+)$//; 
my $linkFromRoot = $dbh->quote($root . $string); 
+0

Tôi thích rằng bạn đã giải thích sai lầm có thể có trong ngữ cảnh hiểu biết. Một chủ đề trong Perl quá quan trọng để bỏ lỡ cơ hội củng cố nó. – HerbN

4

hoàn toàn khỏi chủ đề của câu hỏi ban đầu của bạn, nhưng nó có thể là những gì bạn thực sự muốn là:

my $webpage = URI->new("http://domainname.co.uk/foo/bar.html"); 
my $path = $webpage->rel("http://domainname.co.uk/"); 
print "public_html/$path\n"; 
0

Nếu bạn không cần biến số khác, tôi nghĩ rằng các câu trả lời ở trên là tốt hơn, nhưng một trong những thủ thuật cú pháp nhỏ yêu thích của tôi là tận dụng lợi thế của việc chuyển nhượng là một lvalue, vì vậy với một chút sắp xếp lại dấu ngoặc đơn:

(my $string = $webpage) =~ s/^$domain//g; 

bạn có thể sao chép và sửa đổi nó trong một câu lệnh.

Ngoài ra, cùng với các nội dung khác lạ về mã này, không có nhiều điểm cho rằng /g trên mẫu bắt đầu bằng ^. Nó không thể khớp nhiều hơn một lần.

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