문제

나는 다음 코드 줄을 발견했습니다. 문제가 있습니다 :

  • 그것은 푸시와 동일하게하는 것입니다
  • 그것은 푸시를 사용해야했습니다
  • 읽기가 어렵습니다. 이해합니다
  • 이후 푸시를 사용하도록 변경했습니다
  • 그것은 내가 불법이라고 생각한 일을하지만 분명히

여기있어:

$array [++$#array] = 'data';

내 질문은 : $#Array를 사전에 인수한다는 것은 무엇을 의미합니까? 나는 항상 $#array가 배열의 속성으로 간주하고 쓰기는 안된다고 생각했습니다.

도움이 되었습니까?

해결책

perldata 말 :

"배열의 길이는 스칼라 값입니다. CSH에서와 같이 $#days를 평가하여 배열의 길이를 찾을 수 있습니다. 그러나 이것은 배열의 길이가 아니며 마지막 요소의 첨자입니다. 일반적으로 0 번째 요소가 있기 때문에 다른 값입니다. $#일에 할당하면 실제로 배열의 길이가 변경됩니다. 배열이 짧아지면 중재 값이 파괴됩니다. 이전에 단축 된 배열 연장은 그 값을 복구하지 않습니다. 집단."

$#배열을 수정하는 것은 경우에 따라 유용하지만이 경우 푸시 푸시가 더 좋습니다.

다른 팁

점수 후에는 변수를 먼저 반환 한 다음 증가합니다.

인상 후 사용을 사용하면 먼저 반환 된 이후로 마지막 요소를 수정 한 다음 빈 요소를 끝으로 밀어 넣습니다. 두 번째 루프에서는 그 빈 값을 수정하고 나중에 새 빈 값을 밀어 넣을 것입니다. 그래서 그것은 전혀 푸시처럼 작동하지 않을 것입니다.

사전 증가는 변수를 증가시킨 다음 반환합니다. 그렇게하면 예제는 항상 배열의 새로운 마지막 요소에 글을 쓰고 푸시처럼 작동합니다. 아래 예 :

my (@pre, @post);

$pre[$#pre++] = '1';
$pre[$#pre++] = '2';
$pre[$#pre++] = '3';


$post[++$#post] = '1';
$post[++$#post] = '2';
$post[++$#post] = '3';

print "pre keys: ".@pre."\n";
print "pre: @pre\n";
print "post keys: ".@post."\n";
print "post: @post\n";

출력 :

pre keys: 3
pre: 2 3
post keys: 3
post: 1 2 3

현재 배열 길이보다 큰 값을 할당 $#array 배열을 확장합니다.

이 코드도 작동합니다.

$ perl -le 'my @a; $a[@a]="Hello"; $a[@a]=" world!"; print @a'
Hello world!

Perl Array는 동적이며 한계를 넘어 할당하면 성장합니다.

우선, 그것은 파울입니다.

즉, 나는 그것이 작동한다는 사실에 놀랐습니다. 나는 그것을 추측했을 것이다 ++$#array 숫자를 증가 시키려고 할 때 얻을 수있는 "상수를 수정할 수 없음"오류를 얻었을 것입니다. (물론 실수로 그렇게하는 것은 아닙니다.) 그러나, 그것이 우리가 잘못한 곳이라고 생각합니다. $#array 상수 (숫자)가 아닙니다. 변수 표현식입니다. 따라서 당신은 그것을 엉망으로 만들 수 있습니다. 다음을 고려하세요:

my @array = qw/1 2 3/;

++$#array;
$array[$#array] = qw/4/;

print "@array\n"

그리고 심지어 추가 재미를 위해 : 이것은 다음과 같습니다.

my @array = qw/1 2 3/;

$#array += 5;

foreach my $wtf (@array) {
  if (defined $wtf) {
    print "$wtf\n";
  }
  else {
    print "undef\n";
  }
}

그리고, 예, Perl Cookbook 엉망이되어 기쁩니다 $#array 배열을 성장 시키거나 잘립니다 (4 장, 레시피 3). 나는 아직도 못 생겼다는 것을 알았지 만 아마도 그것은 단지 남아있는 일 뿐이지 만 "편견입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top