Perl에서 my와 local의 차이점은 무엇입니까?
이 스크립트에서 두 가지가 모두 디버그하려고하는데 문헌이 명확하지 않습니다. 누군가 나를 위해 이것을 이해할 수 있습니까?
동적 범위 지정. 깔끔한 컨셉입니다. 많은 사람들이 그것을 사용하지 않거나 이해하지 않습니다.
기본적으로 my
AKA 범위 인 {}의 한 블록에 변수를 만들고 고정하는 것으로 생각 합니다.
my $foo if (true); # $foo lives and dies within the if statement.
그래서 my
변수는 당신이 익숙한 것입니다. 반면 동적 범위 지정을 사용하면 $ var는 어디에서나 선언 할 수 있고 어디에서나 사용할 수 있습니다. 따라서 local
기본적으로 전역 변수 사용을 중지하고 "로컬 값"을 사용하여 작업하십시오. 따라서 local
임시 변수에 대한 임시 범위를 만듭니다.
$var = 4;
print $var, "\n";
&hello;
print $var, "\n";
# subroutines
sub hello {
local $var = 10;
print $var, "\n";
&gogo; # calling subroutine gogo
print $var, "\n";
}
sub gogo {
$var ++;
}
다음과 같이 인쇄되어야합니다.
4
10
11
4
짧은 대답은 my
어휘 범위에서 local
변수를 전용으로 표시하고 동적 범위에서는 변수를 전용으로 표시하는 것입니다.
my
일반적인 의미에서 지역 변수를 생성하므로 이해하기가 더 쉽습니다 . 생성 된 새 변수가 있으며 일반적으로 중괄호로 표시되는 둘러싸는 어휘 블록 내에서만 액세스 할 수 있습니다. 중괄호 규칙에는 다음과 같은 몇 가지 예외가 있습니다.
foreach my $x (@foo) { print "$x\n"; }
그러나 그것은 Perl이 당신이 의미하는 바를 수행하는 것입니다. 일반적으로 다음과 같은 것이 있습니다.
sub Foo {
my $x = shift;
print "$x\n";
}
이 경우 $x
는 서브 루틴 전용이며 범위는 중괄호로 묶여 있습니다. 주의해야 할 점 local
은 my
변수 의 범위가 파일에 작성된 코드와 관련하여 정의된다는 점입니다. 컴파일 타임 현상입니다.
을 이해하려면 local
실행중인 프로그램의 호출 스택 측면에서 생각해야합니다. 변수가 local
이면 local
스택에있는 모든 항목에 대해 명령문이 실행 되는 지점에서 .NET을 포함하는 블록의 호출자에게 스택을 다시 반환 할 때까지 다시 정의됩니다 local
.
처음에는 혼란 스러울 수 있으므로 다음 예제를 고려하십시오.
sub foo { print "$x\n"; }
sub bar { local $x; $x = 2; foo(); }
$x = 1;
foo(); # prints '1'
bar(); # prints '2' because $x was localed in bar
foo(); # prints '1' again because local from foo is no longer in effect
를 foo
처음 호출하면 전역 값이 1 인 것을 확인합니다 $x
. bar
호출되고 local $x
실행되면 $x
스택 에서 전역을 재정의합니다 . 이제 foo
에서를 호출 하면 에 bar
대한 새 값 2가 표시 $x
됩니다. 지금까지는별로 특별하지 않습니다..를 호출하지 않고도 같은 일이 발생했을 것이기 때문 local
입니다. 마법은 bar
반환 할 때에 의해 생성 된 동적 범위를 종료 local $x
하고 이전 전역 $x
이 범위로 돌아온다는 것입니다. 그래서의 마지막 통화 foo
, $x
1입니다.
my
찾고있는 지역 변수를 제공하므로 거의 항상을 사용하고 싶을 것 입니다. 푸른 달이되면 local
멋진 일을하는 데 정말 편리합니다.
Learning Perl 에서 인용 :
그러나 로컬은 이름이 잘못되었거나 적어도 오해의 소지가 있습니다. 우리의 친구 인 Chip Salzenberg는 그가 타임머신으로 돌아가 1986 년에 Larry에게 한 가지 조언을 해줄 기회가 생기면 Larry에게 대신 "save"라는 이름으로 현지에 전화하라고 말할 것이라고 말합니다. [14] 이는 local이 실제로 주어진 전역 변수의 값을 저장하기 때문에 나중에 자동으로 전역 변수로 복원되기 때문입니다. (맞습니다 : 소위 "로컬"변수는 실제로 전역 변수입니다!)이 저장 및 복원 메커니즘은 foreach 루프의 제어 변수와 @_에서 이미 두 번 본 것과 동일한 메커니즘입니다. 서브 루틴 매개 변수의 배열.
따라서 local
전역 변수의 현재 값을 저장 한 다음이를 어떤 형태의 빈 값으로 설정합니다. 한 줄만 시작하는 대신 전체 파일을 훑어 보는 데 사용되는 경우가 많습니다.
my $file_content;
{
local $/;
open IN, "foo.txt";
$file_content = <IN>;
}
호출 local $/
은 입력 레코드 구분 기호 (Perl이 "줄"읽기를 중지하는 값)를 빈 값으로 설정하여 우주선 연산자가 전체 파일을 읽게하므로 입력 레코드 구분 기호에 도달하지 않습니다.
나는 아무도 그 문제에 대한 Mark Jason Dominus의 철저한 논문에 연결되어 있지 않다는 것을 믿을 수 없습니다.
그리고 나중에 무엇이
local
좋은지 알고 싶다면 ,
7 가지 유용한 용도local
http://perldoc.perl.org/perlsub.html#Private-Variables-via-my ()
로컬 연산자에 의해 생성 된 동적 변수와 달리 my로 선언 된 어휘 변수는 호출 된 서브 루틴을 포함하여 외부 세계에서 완전히 숨겨집니다. 자체 또는 다른 곳에서 호출 된 동일한 서브 루틴 인 경우 이는 사실입니다. 모든 호출은 자체 사본을받습니다.
http://perldoc.perl.org/perlsub.html#Temporary-Values-via-local ()
로컬은 나열된 변수를 둘러싸는 블록, eval 또는 do FILE 및 해당 블록 내에서 호출 된 모든 서브 루틴에 대해 "로컬"되도록 수정합니다. 로컬은 전역 (의미 패키지) 변수에 임시 값을 제공합니다. 지역 변수를 생성하지 않습니다. 이를 동적 범위 지정이라고합니다. 어휘 범위 지정은 C의 자동 선언과 더 비슷하게 작동하는 my로 수행됩니다.
나는 이것이 "둘러싸는 블록에 로컬"이라는 말을 제외하고는 전혀 불분명하다고 생각하지 않습니다. 이것은 블록이 종료 될 때 원래 값이 복원된다는 것을 의미합니다.
Google은이 작업에서 정말 잘 작동합니다. http://www.perlmonks.org/?node_id=94007
링크에서 :
요약 : 'my'는 새 변수를 만들고 'local'은 일시적으로 변수 값을 수정합니다.
즉, 'local' 은 변수의 값을 일시적으로 변경 하지만 그것이 존재 하는 범위 내 에서만 가능합니다 .
일반적으로 my를 사용하면 더 빠르고 이상한 일을하지 않습니다.
에서 man perlsub
:
로컬 연산자에 의해 생성 된 동적 변수와 달리 my로 선언 된 어휘 변수는 호출 된 서브 루틴을 포함하여 외부 세계에서 완전히 숨겨집니다.
So, oversimplifying, my
makes your variable visible only where it's declared. local
makes it visible down the call stack too. You will usually want to use my
instead of local
.
Your confusion is understandable. Lexical scoping is fairly easy to understand but dynamic scoping is an unusual concept. The situation is made worse by the names my
and local
being somewhat inaccurate (or at least unintuitive) for historical reasons.
my
declares a lexical variable -- one that is visible from the point of declaration until the end of the enclosing block (or file). It is completely independent from any other variables with the same name in the rest of the program. It is private to that block.
local
, on the other hand, declares a temporary change to the value of a global variable. The change ends at the end of the enclosing scope, but the variable -- being global -- is visible anywhere in the program.
As a rule of thumb, use my
to declare your own variables and local
to control the impact of changes to Perl's built-in variables.
For a more thorough description see Mark Jason Dominus' article Coping with Scoping.
local is an older method of localization, from the times when Perl had only dynamic scoping. Lexical scoping is much more natural for the programmer and much safer in many situations. my variables belong to the scope (block, package, or file) in which they are declared.
local variables instead actually belong to a global namespace. If you refer to a variable $x with local, you are actually referring to $main::x, which is a global variable. Contrary to what it's name implies, all local does is push a new value onto a stack of values for $main::x until the end of this block, at which time the old value will be restored. That's a useful feature in and of itself, but it's not a good way to have local variables for a host of reasons (think what happens when you have threads! and think what happens when you call a routine that genuinely wants to use a global that you have localized!). However, it was the only way to have variables that looked like local variables back in the bad old days before Perl 5. We're still stuck with it.
"my" variables are visible in the current code block only. "local" variables are also visible where ever they were visible before. For example, if you say "my $x;" and call a sub-function, it cannot see that variable $x. But if you say "local $/;" (to null out the value of the record separator) then you change the way reading from files works in any functions you call.
In practice, you almost always want "my", not "local".
Look at the following code and its output to understand the difference.
our $name = "Abhishek";
sub sub1
{
print "\nName = $name\n";
local $name = "Abhijeet";
&sub2;
&sub3;
}
sub sub2
{
print "\nName = $name\n";
}
sub sub3
{
my $name = "Abhinav";
print "\nName = $name\n";
}
&sub1;
Output is :
Name = Abhishek
Name = Abhijeet
Name = Abhinav
dinomite's example of using local to redefine the record delimiter is the only time I have ran across in a lot of perl programming. I live in a niche perl environment [security programming], but it really is a rarely used scope in my experience.
&s;
sub s()
{
local $s="5";
&b;
print $s;
}
sub b()
{
$s++;
}
The above script prints 6.
But if we change local to my it will print 5.
This is the difference. Simple.
I think the easiest way to remember it is this way. MY creates a new variable. LOCAL temporarily changes the value of an existing variable.
참고URL : https://stackoverflow.com/questions/129607/what-is-the-difference-between-my-and-local-in-perl
'program tip' 카테고리의 다른 글
Python 용 Postgres를 설치하는 중 오류 (psycopg2) (0) | 2020.11.23 |
---|---|
Python Pandas 사용자 경고 : 비 연결 축이 정렬되지 않아 정렬 중입니다. (0) | 2020.11.23 |
SICP를 통해 작업하기위한 최상의 Scheme 구현은 무엇입니까? (0) | 2020.11.23 |
Java에서 String과 StringBuffer의 차이점은 무엇입니까? (0) | 2020.11.23 |
두 벡터 사이의 시계 방향 각도를 직접 계산하는 방법 (0) | 2020.11.23 |