Forum Webscript.Ru

Программирование => Perl => Тема начата: Yaroslav от 06 Сентября 2003, 01:08:59

Название: пробелы & push
Отправлено: Yaroslav от 06 Сентября 2003, 01:08:59
приветствую всех :)
вопрос в том, что при использовании push, он перед строчками (всех кроме 1 (в Перле "0")) ставит пробел.
как этого избавиться?
и примерчик:

open (FILE, "file");
@file=;
close (FILE);
for ($str=0;$str<=@file;$str++) {
if ($str eq "2") { push @copyfile,"ok\\n"; }
else { push @copyfile,@file[$str]; } }
open (CFILE, ">copyfile");
print CFILE "@copyfile";
close (CFILE);
Название: пробелы & push
Отправлено: Phoinix от 06 Сентября 2003, 09:42:06
И не только push...
Самый простой вариант:
foreach (@copyfile) {
 $_ =~s /^\\s//;
}
Название: пробелы & push
Отправлено: Alone от 06 Сентября 2003, 12:05:53
:D

print CFILE "@copyfile";
замени на
print CFILE @copyfile;
Название: пробелы & push
Отправлено: norden от 06 Сентября 2003, 12:49:57
Кстати, вот это неправильно:

$str<=@file

ты не можешь сравнивать скаляр с массивом, я вообще удивляюсь как это у тебя работает (?). Надо так:

$str<=$#file

и по поводу пробелов. Я бы делал просто так:

@copyfile = (@file[$str], @copyfile);

и никаких пробелов нигде.
Название: пробелы & push
Отправлено: Phoinix от 06 Сентября 2003, 12:56:23
norden
Пучему же, при приравнивании скаляра к массиву, массив возвращает количество записей массива, единственно зачем использовать "<=" если счет начинается с нуля, цикл будет проходить на один раз больше. Значения массива @file[max] не существует в данном цикле, конечное значение будет @file[max - 1]

А пробелы вставляются действительно как сказал Alone при записи файла, я немного перепутал с выборкой массива из textarea
Название: пробелы & push
Отправлено: mike от 07 Сентября 2003, 15:04:42
Пробелы - это не ошибка оператора push, это особенность print,  который в случае, если массив указан в кавычках, выводит его содержимое, разделяя его содержимым переменной $" (пробел по умолчанию):

@a = (1..5);
print "@a";
$"="\\n";
print "@a"
Название: пробелы & push
Отправлено: Yaroslav от 07 Сентября 2003, 21:28:18
Цитировать
Alone:
print CFILE "@copyfile";
замени на
print CFILE @copyfile

спасибочки, так правда и не понял что произошло, но все равно работает.
Название: пробелы & push
Отправлено: Yaroslav от 07 Сентября 2003, 21:31:56
Цитировать
norden:
Кстати, вот это неправильно:
$str<=@file

правильно, я по книге Шварца пишу. :)
Цитировать
norden:
ты не можешь сравнивать скаляр с массивом, я вообще удивляюсь как это у тебя работает (?). Надо так:
$str<=$#file

что это?
Цитировать
norden:
и по поводу пробелов. Я бы делал просто так:
@copyfile = (@file[$str], @copyfile);

ну.... как умею так и делаю. Вот лучше бы обьяснил ,например, чем твой метод лучше :)
Название: пробелы & push
Отправлено: Yaroslav от 07 Сентября 2003, 21:34:14
Цитировать
Phoinix:
Пучему же, при приравнивании скаляра к массиву, массив возвращает количество записей массива, единственно зачем использовать "<=" если счет начинается с нуля, цикл будет проходить на один раз больше. Значения массива @file[max] не существует в данном цикле, конечное значение будет @file[max - 1]

это все практика
Название: пробелы & push
Отправлено: Yaroslav от 07 Сентября 2003, 23:45:34
Цитировать
mike:
@a = (1..5);
print "@a";
$"="\\n";
print "@a"

поучительно, только не понятно что делает $"="\\n"; ?
Название: пробелы & push
Отправлено: mike от 07 Сентября 2003, 23:59:00
Цитировать
Yaroslav:
поучительно, только не понятно что делает $"="\\n"; ?

Я ж вроде написал :) $" - это переменная, в которой содержится разделитель, используемый print при выводе массива в строку.
Иначе говоря,
$" = "\\n";
print "@array";
аналогичен
print join "\\n", @array;