ความหมายของ@_
ภาษา Perl คืออะไร?
ความหมายของ@_
ภาษา Perl คืออะไร?
คำตอบ:
perldoc perlvarเป็นที่แรกในการตรวจสอบข้อมูลตัวแปร Perl ที่มีชื่อพิเศษ
การอ้างอิง:
@_
: ภายในรูทีนย่อยอาร์เรย์@_
มีพารามิเตอร์ที่ส่งผ่านไปยังรูทีนย่อยนั้น
รายละเอียดเพิ่มเติมสามารถพบได้ในperldoc perlsub (รูทีนย่อย Perl) ที่เชื่อมโยงจาก perlvar:
ข้อโต้แย้งใด ๆ
@_
ผ่านแสดงขึ้นในอาร์เรย์ดังนั้นถ้าคุณเรียกว่าฟังก์ชั่นที่มีสองข้อโต้แย้งเหล่านั้นจะถูกเก็บไว้ในและ
$_[0]
$_[1]
อาร์เรย์
@_
เป็นอาร์เรย์ท้องถิ่นแต่องค์ประกอบที่มีนามแฝงสำหรับพารามิเตอร์เกลาที่เกิดขึ้นจริง โดยเฉพาะอย่างยิ่งหากมีการอัปเดตองค์ประกอบ $ _ [0] อาร์กิวเมนต์ที่เกี่ยวข้องจะได้รับการอัปเดต (หรือเกิดข้อผิดพลาดหากไม่สามารถอัปเดตได้)ถ้าอาร์กิวเมนต์เป็นอาร์เรย์หรือองค์ประกอบแฮชซึ่งไม่มีอยู่เมื่อเรียกใช้ฟังก์ชันองค์ประกอบนั้นจะถูกสร้างขึ้นเฉพาะเมื่อ (และถ้า) มีการแก้ไขหรือมีการอ้างถึง (Perl เวอร์ชันก่อนหน้าบางตัวสร้างองค์ประกอบไม่ว่าจะกำหนดองค์ประกอบให้หรือไม่ก็ตาม) การกำหนดให้กับอาร์เรย์ทั้งหมด @_ จะลบนามแฝงนั้นออกและไม่อัปเดตอาร์กิวเมนต์ใด ๆ
perlcritic
โดยส่วนตัวแล้วฉันคิดว่าสิ่งนี้ดีที่สุดสำหรับฟังก์ชัน แต่สำหรับวิธีการหนึ่งมันมีประโยชน์ต่อshift
การอ้างอิงตัวเองจากนั้นแกะ@_
อาร์เรย์ออก สิ่งนี้ทำให้ชัดเจนว่านี่เป็นวิธีการและวิธีการนี้ใช้พารามิเตอร์บางอย่าง
ครั้งแรกของการค้นหาperl @_
กล่าวนี้ :
@_ คือรายการพารามิเตอร์ขาเข้าของย่อย
นอกจากนี้ยังมีคำอธิบายที่ยาวขึ้นและมีรายละเอียดมากขึ้นเช่นเดียวกัน
คำถามคือความ@_
หมายใน Perl คำตอบสำหรับคำถามที่ว่าตราบเท่าที่$_
หมายถึงมันใน Perl, @_
ทำนองเดียวกันหมายความว่าพวกเขา
ดูเหมือนจะไม่มีใครได้กล่าวถึงนี้ด้านที่สำคัญของมันความหมาย - เช่นเดียวกับพวกเขา
ดังนั้นทั้งคู่จึงใช้เป็นสรรพนามหรือบางครั้งก็ใช้เป็นยาทา
โดยทั่วไปแล้วพวกเขาจะมีบรรพบุรุษเล็กน้อยแม้ว่าจะไม่เสมอไป
คุณยังสามารถใช้ shift สำหรับตัวแปรแต่ละตัวได้ในกรณีส่วนใหญ่:
$var1 = shift;
นี่เป็นหัวข้อที่คุณควรค้นคว้าเพิ่มเติมเนื่องจาก Perl มีวิธีการที่น่าสนใจมากมายในการเข้าถึงข้อมูลภายนอกภายในกิจวัตรย่อยของคุณ
"ตัวแปรพิเศษ" ทั้งหมดของ Perl แสดงอยู่ในหน้าเอกสารของPerlvar
นอกจากนี้หากฟังก์ชันส่งคืนอาร์เรย์ แต่ฟังก์ชันถูกเรียกใช้โดยไม่กำหนดข้อมูลที่ส่งคืนให้กับตัวแปรใด ๆ เช่นด้านล่าง ที่นี่เรียกว่า split () แต่ไม่ได้กำหนดให้กับตัวแปรใด ๆ เราสามารถเข้าถึงข้อมูลที่ส่งคืนได้ในภายหลังผ่าน @_:
$str = "Mr.Bond|Chewbaaka|Spider-Man";
split(/\|/, $str);
print @_[0]; # 'Mr.Bond'
นี้จะแยกสตริงและตั้งแถว$str
@_
@
ใช้สำหรับอาร์เรย์
ในรูทีนย่อยหรือเมื่อคุณเรียกใช้ฟังก์ชันใน Perl คุณอาจส่งผ่านรายการพารามิเตอร์ ในกรณี@_
นั้นสามารถใช้เพื่อส่งรายการพารามิเตอร์ไปยังฟังก์ชัน:
sub Average{
# Get total number of arguments passed.
$n = scalar(@_);
$sum = 0;
foreach $item (@_){
# foreach is like for loop... It will access every
# array element by an iterator
$sum += $item;
}
$average = $sum / $n;
print "Average for the given numbers: $average\n";
}
Average(10, 20, 30);
หากคุณสังเกตโค้ดด้านบนให้ดูforeach $item(@_)
บรรทัด ... ที่นี่จะส่งผ่านพารามิเตอร์อินพุต
use strict
คุณควรเสมอ ดังนั้นฉันจึงแก้ไขฟังก์ชันย่อยของคุณ
อย่าพยายามแก้ไขตัวแปร @_ !!!! พวกเขาจะต้องไม่ถูกสัมผัส .. หรือคุณได้รับผลกระทบบางอย่างที่ไม่น่าสงสัย ตัวอย่างเช่น...
my $size=1234;
sub sub1{
$_[0]=500;
}
sub1 $size;
ก่อนเรียก sub1 $ ขนาดมี 1234. แต่หลังจาก 500 (!!) คุณจะไม่แก้ไขค่านี้ !!! คุณสามารถส่งผ่านค่าตั้งแต่สองค่าขึ้นไปและเปลี่ยนค่าเหล่านี้ในรูทีนย่อยและค่าทั้งหมดจะเปลี่ยนไป! ฉันไม่เคยเห็นผลกระทบนี้อธิบาย โปรแกรมที่ฉันเคยเห็นยังปล่อยให้ @_ array แบบอ่านอย่างเดียว และเฉพาะที่คุณสามารถส่งผ่านตัวแปรได้อย่างปลอดภัยอย่าเปลี่ยนรูทีนย่อยภายในคุณต้องทำเช่นนั้นเสมอ:
sub sub2{
my @m=@_;
....
}
กำหนด @_ ให้กับตัวแปรโพรซีเดอร์รูทีนย่อยโลคัลและทำงานกับตัวแปรต่อไป นอกจากนี้ในอัลกอริธึมการเรียกซ้ำแบบลึกบางตัวที่เรียกใช้อาร์เรย์ใหม่คุณอาจใช้วิธีนี้เพื่อลดหน่วยความจำที่ใช้สำหรับตัวแปรโลคัล เฉพาะในกรณีที่ส่งคืนอาร์เรย์ @_ เหมือนกัน