2010-04-21 23 views
14

này đã làm việc cho tôi trong 5.8 và 5.10, nhưng trong 5,12 mã của tôi tạo ra đối tượng này lạ không qr:Làm cách nào để tạo qr // trong Perl 5.12 từ C?

# running "print Dumper($regex)" 
$VAR1 = bless(do{\(my $o = '')}, 'Regexp'); 

Trong khi in một qr // không được tạo ra bởi mã của tôi trông như thế này:

# running "print Dumper(qr/foo/i)" 
$VAR1 = qr/(?i-xsm:foo)/; 

mã của tôi về cơ bản là:

REGEXP *rx = re_compile(pattern, flags); 
SV *regex = sv_2mortal(newSVpv("",0)); 

sv_magic(regex, (SV*)rx, PERL_MAGIC_qr, 0, 0); 

stash = gv_stashpv("Regexp", 0); 
sv_bless(newRV((SV*)regex), stash); 

Bất cứ ai cũng biết làm thế nào để tạo ra một cách chính xác một regex từ một chuỗi trong 5,12?

Trả lời

11

Cảm ơn bạn đã cho tôi đi đúng hướng, các bạn, hóa ra tôi đã nghiêm túc đánh giá cao điều này. Họ chỉ cắt đường ma thuật và không tạo ra PV.

Đây là tất cả các bạn cần phải làm gì trong Perl 5,12:

REGEXP *rx = re_compile(pattern, flags); 
SV *regex = newRV((SV*)rx); 

stash = gv_stashpv("Regexp", 0); 
sv_bless(regex, stash); 
+1

Hãy chắc chắn rằng bạn chấp nhận câu trả lời của bạn :) –

+1

tôi thích nó khi bạn có thể thoát khỏi ảo thuật. :) –

+0

Tôi cũng vậy! Nó có ý nghĩa hơn rất nhiều theo cách mới. – kristina

6

Hãy xem các nhận xét trong số this câu trả lời của hobbs. Tôi đã sao chép nó bên dưới để dễ đọc:

Các đối tượng Regex thực sự nhận được nhiều "lõi" hơn trong 5.12.0, vì chúng bây giờ tham chiếu đến vô hướng loại REGEXP thay vì tham chiếu đến vô hướng với ma thuật. Tuy nhiên, điều này hoàn toàn vô hình đối với mã người dùng, trừ khi bạn quản lý bỏ qua quá trình xâu chuỗi quá tải, trong trường hợp này bạn sẽ thấy rằng regex bây giờ được in dưới dạng Regexp = REGEXP (0x1234567) thay vì Regexp = SCALAR (0x1234567)

Tôi không đặc biệt quen thuộc với XS, nhưng tôi nghi ngờ bạn không thể sử dụng một giá trị vô hướng nữa để tạo regex của bạn.

5

Perl 5.12 changed regexps to be first class objects, mà bạn tìm thấy như một phần của cuộc thảo luận tiếp tuyến trong How do I check if a scalar has a compiled regex it in?.

Tôi không phải là người XS, vì vậy tôi không biết những gì bạn cần thay đổi trong mã của mình để làm cho nó hoạt động. Tìm kiếm 'REGEXP' trong các nguồn perl hiển thị các bản sửa lỗi họ đã thực hiện cho các mô-đun lõi để sử dụng các công cụ mới.

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