2010-03-12 29 views
26

Mã này gây nên khiếu nại dưới đây:Tại sao Perl phàn nàn "Việc sử dụng phân tách ngầm cho @_ bị phản đối"?

#!/usr/bin/perl 
use strict; 
use warnings; 

my $s = "aaa bbb"; 
my $num_of_item = split(/\s+/, $s) ; 
print $num_of_item; 

Khi tôi chạy mã, Perl than phiền rằng "Use of implicit split to @_ is deprecated". Tôi thực sự không có "ngữ cảnh" cho vấn đề, vì vậy tôi hy vọng bạn giúp giải thích những gì sai với mã số .

+1

Bạn có chắc chắn rằng bạn phải thông báo lỗi toàn bộ đó? Perl của tôi cũng cho tôi biết vấn đề ở trên dòng 6. Vì sự phân chia nằm trên dòng 6, đọc các tài liệu chia nhỏ cho tôi biết vấn đề trong đoạn thứ hai. :) –

Trả lời

33

Bạn đang sử dụng split trong ngữ cảnh vô hướng và trong ngữ cảnh vô hướng, nó chia tách thành mảng @_. Perl đang cảnh báo bạn rằng bạn có thể chỉ bị che dấu @_. (Xem perldoc split để biết thêm thông tin.)

Để có được số lĩnh vực, sử dụng mã này:

my @items = split(/\s+/, $s); 
my $num_of_item = @items; 

hoặc

my $num_of_item =() = split /\s+/, $s, -1; 

Lưu ý: Các hình thức ba đối số của split() là cần thiết bởi vì không chỉ định giới hạn, việc chia tách sẽ chỉ tách ra một phần (một phần nhiều hơn là cần thiết trong số bài tập).

+0

Hoặc để duy trì ngắn gọn, 'my $ num_of_item =() = split (/ \ s + /, $ s)' – mob

+0

@mobrule: bình luận của bạn là muộn :-) –

+1

Phương thức đó với() không hoạt động đối với tôi ; $ num_of_item chỉ được đặt thành 1. –

10

Từ split tài liệu:

Trong bối cảnh vô hướng, trả về số lĩnh vực được tìm thấy. Trong ngữ cảnh vô hướng và vô hiệu, nó chia tách thành mảng @_. Tuy nhiên, việc sử dụng phân tách trong ngữ cảnh vô hướng và vô hiệu sẽ bị phản đối, vì nó ẩn các đối số chương trình con của bạn.

Vì vậy, vì bạn đang sử dụng nó trong ngữ cảnh vô hướng, nó chia tách thành mảng @_, sử dụng không được dùng nữa. (Nó phải làm việc chia nhỏ, vì nó sẽ phá vỡ mã cũ mong đợi nó chia thành @_ - không có cách nào xung quanh cảnh báo mà không gán vào một mảng tạm thời, theo như tôi biết. Eugene Y có điều này một cách rõ ràng trong câu trả lời của anh ta.)

15

Hãy diagnostics cung cấp thêm thông tin:

use strict; 
use warnings; 
use diagnostics; # comment this out when you are done debugging 

my $s = "aaa bbb"; 
my $num_of_item = split(/\s+/, $s) ; 
print $num_of_item; 

Sử dụng chia ngầm để @_ bị phản

(D bị phản đối, W cú pháp) Nó làm rất nhiều công việc cho các trình biên dịch khi bạn ghi đè danh sách đối số của chương trình con, vì vậy sẽ tốt hơn nếu bạn chỉ định kết quả của một phân tách() rõ ràng cho một mảng (hoặc danh sách).

Cách tốt hơn để có được thông tin chẩn đoán là từ dòng lệnh:

perl -Mdiagnostics my_program.pl 
+1

'use diagnostics' là một bacon-saver thực sự khi nói đến việc nhận được tin nhắn cảnh báo bạn không hiểu – mob

+1

@mobrule: bạn cũng có thể đơn giản tìm kiếm những thông điệp này trong« perldoc perldiag' (http://perldoc.perl.org/perldiag.html) để có giải thích dài hơn. – Ether

+1

Hoặc đặt các cảnh báo qua 'splain' (http://perldoc.perl.org/splain.html). – ephemient

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