/ / पर्ल को शिकायत क्यों है "@ के लिए निहित विभाजन का उपयोग पदावनत है"? - पर्ल

पर्ल शिकायत क्यों करता है "@_ को निहित विभाजन का उपयोग बहिष्कृत किया गया है"? - पर्ल

यह कोड नीचे दी गई शिकायत को ट्रिगर करता है:

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

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

जब मैं कोड चलाता हूं, तो पर्ल शिकायत करता है कि "Use of implicit split to @_ is deprecated”। समस्या के लिए मेरे पास वास्तव में कोई "संदर्भ" नहीं है, इसलिए मुझे उम्मीद है कि आप यह समझाने में मदद करेंगे कि क्या गलत है कोड।

उत्तर:

उत्तर № 1 के लिए 33

आप उपयोग कर रहे हैं split स्केलर के संदर्भ में, और स्केलर के संदर्भ में यह में विभाजित है @_ सरणी। पर्ल आपको चेतावनी दे रहा है कि आपके पास सिर्फ @_bbbered हो सकता है। (देख बिगड़ा हुआ अधिक जानकारी के लिए।)

फ़ील्ड की संख्या प्राप्त करने के लिए, इस कोड का उपयोग करें:

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

या

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

नोट: विभाजन का तीन-तर्क रूप आवश्यक है () क्योंकि एक सीमा को निर्दिष्ट किए बिना, विभाजन केवल एक टुकड़े को विभाजित करेगा (एक से अधिक की आवश्यकता होती है) काम)।


जवाब के लिए 15 № 2

चलो निदान अधिक जानकारी प्रदान करें:

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;

@_ के लिए अंतर्निहित विभाजन का उपयोग पदावनत है

(डी पदावनत, डब्ल्यू वाक्य रचना) यह संकलक के लिए बहुत काम करता है जब आप एक सबरूटिन की तर्क सूची को क्लोब करते हैं, इसलिए यदि आप इसे असाइन करते हैं तो बेहतर है एक विभाजन के परिणाम () स्पष्ट रूप से एक सरणी (या सूची) के लिए।

नैदानिक ​​जानकारी प्राप्त करने का एक बेहतर तरीका कमांड लाइन से है:

perl -Mdiagnostics my_program.pl

जवाब के लिए 10 № 3

वहाँ से विभाजित करें डॉक्स:

स्केलर संदर्भ में, फ़ील्ड की संख्या लौटाता हैमिल गया। स्केलर और शून्य संदर्भ में यह @_ सरणी में विभाजित होता है। स्केलर और शून्य संदर्भ में विभाजन का उपयोग पदावनत किया जाता है, हालांकि, क्योंकि यह आपके सबरूटीन तर्कों को देखता है।

इसलिए, चूंकि आप इसे स्केलर के संदर्भ में उपयोग कर रहे हैं, इसलिए यह इसमें विभाजित हो जाता है @_ एरे, जो कि एक पदावनत उपयोग है। (हालांकि यह विभाजन करना है, क्योंकि यह पुराने कोड को तोड़ने की उम्मीद कर रहा है @_ - जहां तक ​​मुझे पता है, अस्थायी सरणी में असाइन किए बिना चेतावनी के आसपास कोई रास्ता नहीं है। यूजीन वाई ने अपने उत्तर में यह स्पष्ट रूप से लिखा है।)