Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Массив в модуле


Автор: Гость_Valery 9.6.2004, 18:00
Передаю в подпрограмму, которая находится подключаемом модуле,
переменную вида 'abcdefgh', т. е. строка символов, далее хочу посимвольно
разделить её в массив: @array = split ( '', $var ). Инициализации массива
НЕ ПРОИСХОДИТ! Когда подпрограмма в том же файле, то всё работает...
Что неправильно???

Автор: HalkaR 9.6.2004, 21:26
А сам то перменная передается?

Можно исходники поглядеть?

Автор: g-valery 10.6.2004, 08:15
Сама переменная передается. Да и если бы не передавалась, массив, хотя бы пустой,
должен быть? А про исходники - я ж написал: @array = split ( '', $var ) $var='абвгдежз' и т.д.,
то есть строка символов, в отладчике смотрел, переменная присутствует

Автор: korob2001 11.6.2004, 01:47
Цитата

@array = split ( '', $var ) $var='абвгдежз'

Это не исходник. На такой исходник могу дать только такой ответ:
Код

$var = 'абвгдежз';
@array = split ( '', $var );

Так эта строка будет выглядеть более правильно.

Если проблема так и осталась не решённой, давай исходник. Это форум программистов, а не ясновидещих.

Удачи.

Автор: g-valery 11.6.2004, 11:27
sub koi2unicode
{
%decode=(
'А'=>'10','Б'=>'11','В'=>'12','Г'=>'13','Д'=>'14','Е'=>'15','Ж'=>'16','З'=>'17',
'И'=>'18','Й'=>'19','К'=>'1a','Л'=>'1b','М'=>'1c','Н'=>'1d','О'=>'1e','П'=>'1f',
'Р'=>'20','С'=>'21','Т'=>'22','У'=>'23','Ф'=>'24','Х'=>'25','Ц'=>'26','Ч'=>'27',
'Ш'=>'28','Щ'=>'29','Ъ'=>'2a','Ы'=>'2b','Ь'=>'2c','Э'=>'2d','Ю'=>'2e','Я'=>'2f',
'Ё'=>'01',
'а'=>'30','б'=>'31','в'=>'32','г'=>'33','д'=>'34','е'=>'35','ж'=>'36','з'=>'37',
'и'=>'38','й'=>'39','к'=>'3a','л'=>'3b','м'=>'3c','н'=>'3d','о'=>'3e','п'=>'3f',
'р'=>'40','с'=>'41','т'=>'42','у'=>'43','ф'=>'44','х'=>'45','ц'=>'46','ч'=>'47',
'ш'=>'48','щ'=>'49','ъ'=>'4a','ы'=>'4b','ь'=>'4c','э'=>'4d','ю'=>'4e','я'=>'4f',
'ё'=>'51');
$out='';
@a = split('',$text_koi);
foreach (@a)
{
if (exists($decode{$_}))
{
$_=$decode{$_};
$_="$#x04".$_.";";
$out=$out.$_;
}
}
return $out;
}
В $text_koi - передаваемая строка символов

Автор: GoodBoy 11.6.2004, 11:46
Цитата
В $text_koi - передаваемая строка символов

А где ты ее в процедуру передаешь??????????

сделай так:
Код
sub koi2unicode {
   my $text_koi = shift;
...

и вызывай процедуру так:

Код
my $ret = &koi2unicode($str);

Автор: g-valery 15.6.2004, 17:08
Типа умных больше нету...smile.gif

На:

сделай так:
sub koi2unicode {
my $text_koi = shift;
...
и вызывай процедуру так:
my $ret = &koi2unicode($str);

А мне казалось, из модуля надо вызывать
$ret = MODULE->koi2unicode($str); smile.gif))

Переменная ПЕРЕДАЕТСЯ!!! Что к ней привязялись? Повторяю еще раз вопрос:
ПОЧЕМУ не создается массив (хотя бы пустой)?

Автор: Guest 15.6.2004, 19:11
Цитата

А мне казалось, из модуля надо вызывать
$ret = MODULE->koi2unicode($str);

Так вызывают метод класса.
Если у тебя нормальный модуль, то он по идее должен экспорировать свои функции в пространство имён main. Goodboy всё правильно написал.

Если же у тебя класс, попробуй написать его так:
Назовём его: MyClass.pm
Код

package MyClass;

use strict;

# Создаём конструктор класса
sub new {
   my $check = shift;
   my $class = ref( $check ) || $check;
   my $self  = {};
   bless( $self, $class );
   return $self;
}

# Твой метод
sub koi2unicode {
   my $text_koi = @_[1];
   my %decode=(
             'А'=>'10','Б'=>'11','В'=>'12','Г'=>'13','Д'=>'14','Е'=>'15','Ж'=>'16','З'=>'17',
             'И'=>'18','Й'=>'19','К'=>'1a','Л'=>'1b','М'=>'1c','Н'=>'1d','О'=>'1e','П'=>'1f',
             'Р'=>'20','С'=>'21','Т'=>'22','У'=>'23','Ф'=>'24','Х'=>'25','Ц'=>'26','Ч'=>'27',
             'Ш'=>'28','Щ'=>'29','Ъ'=>'2a','Ы'=>'2b','Ь'=>'2c','Э'=>'2d','Ю'=>'2e','Я'=>'2f',
             'Ё'=>'01',
             'а'=>'30','б'=>'31','в'=>'32','г'=>'33','д'=>'34','е'=>'35','ж'=>'36','з'=>'37',
             'и'=>'38','й'=>'39','к'=>'3a','л'=>'3b','м'=>'3c','н'=>'3d','о'=>'3e','п'=>'3f',
             'р'=>'40','с'=>'41','т'=>'42','у'=>'43','ф'=>'44','х'=>'45','ц'=>'46','ч'=>'47',
             'ш'=>'48','щ'=>'49','ъ'=>'4a','ы'=>'4b','ь'=>'4c','э'=>'4d','ю'=>'4e','я'=>'4f',
             'ё'=>'51' );
   my $out='';
   my @a = split('',$text_koi);
  foreach (@a) {
       if ( exists( $decode{ $_ } ) ) {
               $_=$decode{ $_ };
               $_="$#x04" . $_ . ";";
               $out=$out.$_;
       }
  }
return $out;
}

1; # Истенное значение


Сохрани его в каталоге /cgi-bin/test/MyClass

Теперь давай попробуем вызвать твой метод koi2unicode:
Втомже каталоге создай файл с таким содержимым:
Код

#!/usr/bin/perl -w
use strict;
use lib qw(.);
use MyClass;
my $unicode = new MyClass;
my $string= 'Привет!';
my $encoding = $unicode->koi2unicode( $string );
print $encoding, "\n";

Если где-то ошибка то дай знать, просто не тестировал, времени нет.
Удачи.

Автор: korob2001 15.6.2004, 20:49
Ой, забыл войти в систему. Постинг выше, мой.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)