LINUX.ORG.RU

ошибка синтаксиса

 


0

1

Привет всем! Пришлось писать такой код:

if( $types[$i] eq 'Integer' ) { 
    $row += ord for @buff;
} 
else { 
  ( $row = join '', @buff ) =~ s/\s+$//g;
}

потому что

$types[$i] eq 'Integer' 
    ?  $row += ord for @buff 
    : ($row = join '', @buff) =~ s/\s+$//g;
ругается на syntax error ... near «ord for » В чём дело?

P.S. Подсветка всё?

Deleted

Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от IIIypuk

уже да. вроде не пил :)

Заодно, чуваки, помогите вот с чем:

Есть такая структура анонимного хеша:

$VAR = {
    'VAL1' => [
              'text1',
              'text2'
              ],
    'VAL2' => [
               num1,
               num2
              ]
};
не могу получить доступ к массиву вот так:
print @{ $hash_ref->{'VAL1'} }; 
но если помещу keys $hash_ref в массив, и потом вызываю их из массива:
 @{ $hash_ref->{ $array[$index] } }
то всё норм. Аномалия какая-то.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)

Зачем так писать код, если не осилили синтаксис? Типа коротко, как будто папка писал?

Вангую: аргументы для for должны быть в круглых скобках. И писать ord($_) вместо ord.

gh0stwizard ★★★★★
()
Последнее исправление: gh0stwizard (всего исправлений: 1)
Ответ на: комментарий от gh0stwizard

Зачем так писать код, если не осилили синтаксис?

так чтоб синтаксис и узнать, на практике.

Типа коротко, как будто папка писал?

ну не без того)) мне нравится уметь писать по всякому.

Вангую: аргументы для for должны быть в круглых скобках. И писать ord($_) вместо ord.

ннн-ееее-аааа! ;)

P.S. Помоги с ошибка синтаксиса (комментарий) плиз.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от Deleted

Опять же, вангую, print ожидает print OUTPUT_FD @args. Поскольку неизвестно чему у тебя равен perldoc -v '$,' без точного вывода ошибки или выхлопа гадать больше нет сил :) Используй print join ' ', @{...}

gh0stwizard ★★★★★
()
Последнее исправление: gh0stwizard (всего исправлений: 1)
Ответ на: комментарий от gh0stwizard

не, $OFS не причём. print @{ $href{'KEY'} } должен просто напечатать массив, без разделителя. Но не печатает. А если print @{ $href{each $href} }, то печатает. Почему когда ввожу ключ - не работает, а когда вытаскиваю из массива работает?

P.S. в первом случае - дело не в ord($_) for (@buff); Также синтаксическая ошибка. А ord for @buff в if { } - не ошибка :-D

P.P.S.

Используй print join ' ', @{...}

Use of uninitialized value in array dereference

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)

Во-первых,

$types[$i] eq 'Integer'
    ?  do { $row += ord for @buff }
    : (($row = join '', @buff) =~ s/\s+$//g);
Во-вторых, пожалуйста, больше никогда не пиши на перле (а лучше вообще не пиши), а всё что уже написал затри shred'ом.

redgremlin ★★★★★
()
Ответ на: комментарий от redgremlin

Помоги еще с хешами, пожалуйста... и обещаю, отойду от компьютера, и пойду на дачу копать огород.

И если великодушие позволит - почему такое исправление? вроде не в приоритетах дело.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от Deleted

С хешами я вообще не понял, кто на ком стоял, откуда взялась ссылка и чего ты от них хочешь. Код

$VAR = { 'VAL' => [ 0, 1, 2] };
printf join ' ', @{$VAR->{'VAL'}};
работает, как ожидалось.

redgremlin ★★★★★
()
Ответ на: комментарий от redgremlin

test.pl

#!/usr/bin/perl

my $href;
{
    open my $in, '<', 'dump';
    local $/;
    $href = eval <$in>;
    close $in;
}
my $numrecs = $#{ $href->{each $href} };
my @names = keys $href;

print join '', @{ $href->{'NAME'} }; # не работает
print @{ $href->{each $href} }; # работает
print @{ $href->{$names[1]} }; # тоже работает

dump-файл http://pastebin.com/tLW0W3xr

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от Deleted

почему такое исправление?

$ perl -e '0 ? $a if $b : 1;'
syntax error at -e line 1, near "$a if"
Execution of -e aborted due to compilation errors.
$ perl -e '0 ? do { $a if $b } : 1;'
$

Намёк ясен?

$a ? $b=0 : $b=1; # == ($a ? $b=0:$b) = 1, != ($a) ? ($b=0) : ($b=!) so $b always 1

Надеюсь, с этим тоже ясно?

redgremlin ★★★★★
()
Последнее исправление: redgremlin (всего исправлений: 1)
Ответ на: комментарий от redgremlin

классно, премного благодарен :)

Deleted
()
Ответ на: комментарий от Deleted

Для понимания, что там на самом деле происходит, делай так:
1) Запусти этот вариант, повтыкай в выхлоп.
2) Закомментируй строчку my @names = keys $href; , запусти, повтыкай в выхлоп, начни понимать, что чего-то ты не понимаешь.
3) Добавь ещё пару строк вида print @{ $href->{each $href} }; , запусти, повтыкай в выхлоп, осознай дзен.

redgremlin ★★★★★
()
Ответ на: комментарий от redgremlin
Summary of my perl5 (revision 5 version 18 subversion 1) configuration:
   
  Platform:
    osname=linux, osvers=3.10.9-smp, archname=i486-linux-thread-multi
    uname='linux hive 3.10.9-smp #1 smp wed aug 21 15:27:17 cdt 2013 i686 amd phenom(tm) ii x6 1100t processor authenticamd gnulinux '
    config_args='-de -Dprefix=/usr -Dsiteprefix=/usr/local -Dsitelib=/usr/local/share/perl5 -Dsitearch=/usr/local/lib/perl5 -Darchlib=/usr/lib/perl5 -Dvendorprefix=/usr -Dprivlib=/usr/share/perl5 -Dvendorlib=/usr/share/perl5/vendor_perl -Dvendorarch=/usr/lib/perl5/vendor_perl -Dscriptdir=/usr/bin -Dcccdlflags=-fPIC -Dinstallprefix=/usr -Dlibpth=/usr/local/lib /usr/lib /lib -Doptimize=-O2 -march=i486 -mtune=i686 -Dusethreads -Duseithreads -Duseshrplib -Ubincompat5005 -Uversiononly -Dpager=/usr/bin/less -isr -Darchname=i486-linux'
    hint=recommended, useposix=true, d_sigaction=define
    useithreads=define, usemultiplicity=define
    useperlio=define, d_sfio=undef, uselargefiles=define, usesocks=undef
    use64bitint=undef, use64bitall=undef, uselongdouble=undef
    usemymalloc=n, bincompat5005=undef
  Compiler:
    cc='cc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64',
    optimize='-O2 -march=i486 -mtune=i686',
    cppflags='-D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include'
    ccversion='', gccversion='4.8.1', gccosandvers=''
    intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234
    d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=12
    ivtype='long', ivsize=4, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8
    alignbytes=4, prototype=define
  Linker and Libraries:
    ld='cc', ldflags =' -fstack-protector -L/usr/local/lib'
    libpth=/usr/local/lib /usr/lib /lib
    libs=-lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lpthread -lc
    perllibs=-lnsl -ldl -lm -lcrypt -lutil -lpthread -lc
    libc=/lib/libc-2.17.so, so=so, useshrplib=true, libperl=libperl.so
    gnulibc_version='2.17'
  Dynamic Linking:
dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E -Wl,-rpath,/usr/lib/perl5/CORE'
    cccdlflags='-fPIC', lddlflags='-shared -O2 -march=i486 -mtune=i686 -L/usr/local/lib -fstack-protector'


Characteristics of this binary (from libperl): 
  Compile-time options: HAS_TIMES MULTIPLICITY PERLIO_LAYERS
                        PERL_DONT_CREATE_GVSV
                        PERL_HASH_FUNC_ONE_AT_A_TIME_HARD
                        PERL_IMPLICIT_CONTEXT PERL_MALLOC_WRAP
                        PERL_PRESERVE_IVUV PERL_SAWAMPERSAND USE_ITHREADS
                        USE_LARGE_FILES USE_LOCALE USE_LOCALE_COLLATE
                        USE_LOCALE_CTYPE USE_LOCALE_NUMERIC USE_PERLIO
                        USE_PERL_ATOF USE_REENTRANT_API
  Built under linux
  Compiled at Sep  5 2013 22:01:10
  @INC:
    /usr/local/lib/perl5
    /usr/local/share/perl5
    /usr/lib/perl5/vendor_perl
    /usr/share/perl5/vendor_perl
    /usr/lib/perl5
    /usr/share/perl5

у меня такой вот perl. Не работает :(

Deleted
()
Ответ на: комментарий от fero

Use of uninitialized value in array dereference at user.parse.pl line 13.

на вышеприведённую строчку.

Deleted
()
Ответ на: комментарий от Deleted

Он его и печатает. А print @{ $href->{each $href} }; печатает ID. Если в 18 перле это вдруг не так, добавь use 5.014; и точно будет именно так.

redgremlin ★★★★★
()
Ответ на: комментарий от redgremlin

Добавил. Can't use an undefined value as an ARRAY reference.

А print @{ $href->{each $href} }; печатает ID.

а у меня случайный ключ берёт.

P.S. Вообще дамп $href даёт $VAR1 = undef;

Deleted
()
Последнее исправление: Deleted (всего исправлений: 3)
Ответ на: комментарий от Deleted
$  cat test2.pl
#!/usr/bin/perl

my $href;
{
    open my $in, '<', 'dump';
    local $/;
    $href = eval <$in>;
    close $in;
}
my $numrecs = $#{ $href->{each $href} };
my @names = keys $href;

print join '', @{ $href->{'NAME'} };
print @{ $href->{each $href} };
print @{ $href->{$names[1]} };
$ perl test2.pl
VadimAndrewLeseaOleaMashaOlesyaNikitaVanyaDenisEmmanuelNikiforVasileDumitru3456789101211121314VadimAndrewLeseaOleaMashaOlesyaNikitaVanyaDenisEmmanuelNikiforVasileDumitru
$ perl --version

This is perl 5, version 14, subversion 2 (v5.14.2) built for x86_64-linux-thread-multi
(with 1 registered patch, see perl -V for more detail)
redgremlin ★★★★★
()

Короче, использовать выражения в тернарном операторе- плохой стиль программирования. Ты онлайн-магазины однострочниками пишешь?

fero ★★★★
()
Ответ на: комментарий от fero

понял, больше не буду, или буду, но осторожно. помоги с хешами разобраться. Какая у тебя версия perl'a? если 5.18 проверь код, пожалуйста.

Deleted
()
Ответ на: комментарий от redgremlin

5.18 не пашет. проверял в нескольких дистрах.

Deleted
()
Ответ на: комментарий от Deleted

УМВР.

This is perl 5, version 18, subversion 1 (v5.18.1) built for i486-linux-thread-multi

Copyright 1987-2013, Larry Wall

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl".  If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.

fero ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.