Что означает к преинкрементному $ #array?

midl.exe (из Windows SDK) должен иметь возможность генерировать tlb из файла idl.

Если в файле idl нет определения библиотеки, вы можете добавить его самостоятельно, как объяснил Ханс Пассант в ответе на на этот вопрос .

5
задан brian d foy 2 March 2009 в 20:45
поделиться

5 ответов

perldata говорит:

"Длина массива является скалярной величиной. Можно найти длину массива @days путем оценки $ #days, как в csh. Однако это не длина массива; это - нижний индекс последнего элемента, который является другим значением, так как обычно существует 0th элемент. Присвоение $ #days на самом деле изменяет длину массива. При сокращении массива этот путь уничтожает прошедшие значения. Удлинение массива, который был ранее сокращен, не восстанавливает значения, которые были в тех элементах".

Изменение $ #array полезно в некоторых случаях, но в этом случае, ясно продвиньте, лучше.

14
ответ дан 18 December 2019 в 06:13
поделиться

Постинкремент возвратит переменную сначала и затем увеличит ее.

При использовании постинкремента, Вы были бы modifing последний элемент, начиная с его возвращенного первого, и затем продвижение пустого элемента на конец. На втором цикле Вы были бы modifing что пустое значение и продвижение нового пустого на потом. Таким образом, это не работало бы как нажатие вообще.

Преинкремент увеличит переменную и затем возвратит ее. Тем путем Ваш пример, всегда будет будучи пишущим в новый, последний элемент массива и работать как нажатие. Пример ниже:

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
4
ответ дан 18 December 2019 в 06:13
поделиться

Присвоение значения, больше, чем длина современного массива к $#array расширяет массив.

4
ответ дан 18 December 2019 в 06:13
поделиться

В первую очередь, это - фол.

Тем не менее я также удивлен, что это работает. Я предположил бы это ++$#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 рада смешать с $#array выращивать или усекать массивы (Глава 4, рецепт 3). Я все еще нахожу это ужасным, но возможно это - просто непрекращающееся, "но это - число" предубеждение.

1
ответ дан 18 December 2019 в 06:13
поделиться

Этот код работает также:

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

Массив Perl является динамическим и растет, когда присваиваются вне пределов.

3
ответ дан 18 December 2019 в 06:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: