ฉันจะใช้คีย์เวิร์ด“ ของฉัน” ใน Perl ได้อย่างไร


93

ฉันมักจะเห็นคีย์เวิร์ด "ของฉัน" หน้าชื่อตัวแปรในตัวอย่างสคริปต์ Perl ออนไลน์ แต่ฉันไม่รู้ว่ามันหมายถึงอะไร ฉันพยายามอ่านหน้าคู่มือและเว็บไซต์อื่น ๆ ทางออนไลน์ แต่ฉันมีปัญหาในการแยกแยะว่ามันคืออะไรเนื่องจากความแตกต่างระหว่างวิธีที่ฉันเห็นและคู่มือ

ตัวอย่างเช่นใช้เพื่อรับความยาวของอาร์เรย์ในโพสต์นี้: ค้นหาขนาดของอาร์เรย์ใน Perl

แต่คู่มือบอกว่า:

A ของฉันประกาศตัวแปรที่แสดงรายการเป็นโลคัล (ศัพท์) ไปยังบล็อกไฟล์หรือ eval หากมีมากกว่าหนึ่งค่ารายการจะต้องอยู่ในวงเล็บ

มันทำอะไรและใช้อย่างไร?


3
Re "ใช้เพื่อรับความยาวของอาร์เรย์ในโพสต์นี้" ไม่เลย myไม่ได้คำนึงถึงอย่างน้อยที่สุด มันเป็นผู้ประกอบการที่ได้รับมอบหมายเกลา ( =) @arrที่บังคับใช้บริบทเกลาบน
ikegami

ถ้าไม่ใช่ "ของคุณ" จริงๆก็ไม่ควรใช้
icenac

คำตอบ:


145

myจำกัดขอบเขตของตัวแปร ขอบเขตของตัวแปรคือตำแหน่งที่สามารถมองเห็นได้ การลดขอบเขตของตัวแปรลงในจุดที่ต้องการตัวแปรเป็นลักษณะพื้นฐานของการเขียนโปรแกรมที่ดี ทำให้รหัสอ่านง่ายขึ้นและมีข้อผิดพลาดน้อยลงและส่งผลให้เกิดประโยชน์ที่ได้รับมากมาย

หากคุณไม่ประกาศตัวแปรโดยใช้myตัวแปรส่วนกลางจะถูกสร้างขึ้นแทน สิ่งนี้ควรหลีกเลี่ยง การใช้use strict;บอก Perl ว่าคุณต้องการป้องกันไม่ให้สร้างตัวแปรส่วนกลางโดยปริยายซึ่งเป็นเหตุผลที่คุณควรใช้use strict;(และuse warnings;) ในโปรแกรมของคุณ


การอ่านที่เกี่ยวข้อง: ทำไมต้องใช้use strict;และuse warnings;?


12
สุดท้ายคำตอบที่อธิบายว่าทำไม
ThisSuitIsBlackNot

สำหรับคนที่มาที่นี่จาก JS: มันเป็นหลักเช่นvarและletใน JavaScript หากไม่มี'use strict';JS จะช่วยให้คุณสามารถประกาศตัวแปรส่วนกลางใหม่โดยไม่มีคำหลักใด ๆ ซึ่งไม่ถือว่าเป็นแนวทางปฏิบัติที่ดีที่สุด
กาแฟไฟฟ้า

@Electric กาแฟเงื่อนไขใน JS คำถามที่จะเป็น "อะไรletและvarทำและวิธีการที่พวกเขาควรจะใช้?" และใช่คำตอบจะใกล้เคียงกัน ( letvars ของ JS ก็เหมือนกับmyvars ของ Perl ยกเว้นว่าletไม่สามารถจับ vars ได้)
ikegami

ฉันแค่หมายความว่าถ้าคนมาที่ Perl จาก JS มันจะเป็นวิธีง่ายๆในการอธิบายแนวคิดเดียวกัน
Electric Coffee

@ElectricCoffee 1) โปรแกรมเมอร์ที่เข้าใจการกำหนดขอบเขตไม่จำเป็นต้องอธิบายให้ฟังอีกหลังจากเปลี่ยนภาษา 2) ไม่แน่ใจว่าคุณได้อธิบายขอบเขตจริงๆแล้วในแง่โปรแกรมเมอร์ JS จะเข้าใจหรืออย่างอื่น บางทีคุณอาจกำลังพยายามอธิบายuse strict;? แต่นั่นไม่ใช่คำถามและuse strict;มีมากกว่านั้น หรือบางทีคุณอาจหมายถึงการสื่อสารที่myจำกัด ขอบเขตของ vars kinda like letand vardo แต่นั่นเป็นประโยคแรกของคำตอบ 3) หากคุณต้องการตอบคำถามที่แตกต่างออกไปนั่นคือสิ่งที่คำตอบมีไว้สำหรับ
ikegami

28

สรุปด่วน: myสร้างตัวแปรใหม่localแก้ไขค่าของตัวแปรชั่วคราว

ในตัวอย่างด้านล่าง $ :: a หมายถึง $ a ในเนมสเปซ "global"

$a = 3.14159;
{
  my $a = 3;
  print "In block, \$a = $a\n";
  print "In block, \$::a = $::a\n";
}
print "Outside block, \$a = $a\n";
print "Outside block, \$::a = $::a\n";

# This outputs
In block, $a = 3
In block, $::a = 3.14159
Outside block, $a = 3.14159
Outside block, $::a = 3.14159

กล่าวคือlocalเปลี่ยนค่าของตัวแปรชั่วคราว แต่อยู่ในขอบเขตที่มีอยู่เท่านั้น

ที่มา: http://www.perlmonks.org/?node_id=94007

อัปเดต

เกี่ยวกับความแตกต่างระหว่างourและmyโปรดดู

(ขอบคุณThisSuitIsBlackNot )


สนใจที่จะอธิบาย 'ของพวกเขา' หรือไม่? ฉันมักจะพบสิ่งที่สับสน
rdodev

@rdodev: คุณหมายถึงอะไร?
Igor Chubin

ฉันเห็นรหัส perl ทั้ง 'ของฉัน' และ 'ของพวกเขา' และไม่เคยเข้าใจถึงความแตกต่างเลยในทางปฏิบัติ
rdodev

3
@rdodev ฉันคิดว่าคุณหมายถึงour: stackoverflow.com/questions/845060/…
ThisSuitIsBlackNot

1
ฉันคิดว่าคำตอบนี้ต้องการการปรับเปลี่ยน คุณมีตัวอย่างโค้ดที่แสดงให้เห็นถึงการใช้งานmyแต่จากนั้นทำตามด้วยประโยคที่พูดถึงlocalราวกับว่าคุณเพิ่งแสดงให้เห็นถึงการlocalใช้งานแม้ว่าlocalจะไม่ได้แสดงให้เห็นที่ใดในคำตอบนี้ ฉันคิดว่าคุณอ้างแหล่งที่มาใน PerlMonks ผิดซึ่งมีสองตัวอย่างโค้ด ประโยคเกี่ยวกับlocalกำลังอธิบายอีกประโยคหนึ่งไม่ใช่ประโยคที่คุณถอดความที่นี่
Temporary_user_name

5

ตัวแปรส่วนตัวผ่าน my ()เป็นเอกสารหลักสำหรับmy.

ในตัวอย่างขนาดอาร์เรย์ที่คุณกล่าวถึงจะไม่ใช้เพื่อค้นหาขนาดของอาร์เรย์ ใช้เพื่อสร้างตัวแปรใหม่เพื่อเก็บขนาดของอาร์เรย์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.