midl.exe
(из Windows SDK) должен иметь возможность генерировать tlb
из файла idl
.
Если в файле idl
нет определения библиотеки, вы можете добавить его самостоятельно, как объяснил Ханс Пассант в ответе на на этот вопрос .
perldata говорит:
"Длина массива является скалярной величиной. Можно найти длину массива @days путем оценки $ #days, как в csh. Однако это не длина массива; это - нижний индекс последнего элемента, который является другим значением, так как обычно существует 0th элемент. Присвоение $ #days на самом деле изменяет длину массива. При сокращении массива этот путь уничтожает прошедшие значения. Удлинение массива, который был ранее сокращен, не восстанавливает значения, которые были в тех элементах".
Изменение $ #array полезно в некоторых случаях, но в этом случае, ясно продвиньте, лучше.
Постинкремент возвратит переменную сначала и затем увеличит ее.
При использовании постинкремента, Вы были бы 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
Присвоение значения, больше, чем длина современного массива к $#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 рада смешать с $#array
выращивать или усекать массивы (Глава 4, рецепт 3). Я все еще нахожу это ужасным, но возможно это - просто непрекращающееся, "но это - число" предубеждение.
Этот код работает также:
$ perl -le 'my @a; $a[@a]="Hello"; $a[@a]=" world!"; print @a'
Hello world!
Массив Perl является динамическим и растет, когда присваиваются вне пределов.