LINUX.ORG.RU

Operation "-": no method found

 


0

2

День добрый. При попытке посчитать переменную в perl вываливается ошибка. Подскажите как побороть.

Operation "-": no method found, left argument in overloaded package XML::XPath::Literal, right argument has no overloaded magic at ./test.pl line 40.

line 40: my $a=$b-1;



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

Ответ на: комментарий от router

Помогите чайнику. Это теперь для всех переменных с которыми арифметический действия будут совершать такую конструкцию использовать?

slon362
() автор топика
Ответ на: комментарий от router

тоесть чтобы в перл выполнить операцию вычитания надо в начале скрипта поместить use Data::Dumper; а перед операцией printf «%s\n», ref($b); printf «%s\n», Dumper($b);

А как тогда с операций умножения на число?

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

Т.е. ты считаешь, что если напечатать карту обоих континентов и численное значение скорости света, то после этого вычитать можно?

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

У меня в переменной число, т.к. оно парсится из известного файла. PERL сам определяет тип переменной, или я что-то не знаю просто? Дальше идет просто операция вычесть из второй переменной и присвоить первой. ИМХО в $dbh->do(«update нельзя применять математические операции, поэтому я выношу их выше. Где я не прав?

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

Начинаю понимать, а почему оно может быть не Number, ?

в XML числе нет.

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

PERL сам определяет тип переменной, или я что-то не знаю просто?

Он может автоматически преобразовать строку в число, а тут XML::XPath::Literal. Попробуй:

my $a = $b->value() - 1
Правда, я не уверен в правильности и кошерности. Потом, в некоторых ситуациях он тоже должен имплицитно преобразовываться в строку. Видимо, не в этой.

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

Сколько получится, если из двух континентов вычесть скорость света?

Справедливости ради скажем, что Perl - это язык, где это вполне могло бы работать. Например, скорость света вычиталась бы из суммы скоростей смещения литосферных плит, на которых они находятся. Или суммы скоростей движения этих континентов вокруг Солнца.

И когда вдруг обнаруживается, что такое вычисление сделать можно, но только если карта физическая, а не политическая, новички фигеют.

Так что ты зря подъ***ваешься.

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

Так что ты зря подъ***ваешься

'ся$' лишнее %)

Справедливости ради скажем, что Perl - это язык, где это вполне могло бы работать.

Если бы можно было привести один тип к другому, как и в любом языке программирования. Пока новички рабоают с scalar, hash и array - могут делать что угодно. И при отключенном use strict будут сильно удивляться результату. Но с объектами и ссылками это уже не работает.

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

Аналогично первому варианту: Operation "-": no method found,

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

Data::Dumper, ref и printf - «не бубен, а средство отладки»

Кстати, раз ты полез в объекты, советую почитать «Программирование на Perl», Л.Уолл, Т.Кристиансен, Дж.Орвант

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

use strict

#!/usr/bin/perl

use strict; use File::Basename; use DBI; use utf8; use Encode; use v5.10; use XML::XPath; use File::Slurp; use Data::Dumper; use LWP::Simple;

slon362
() автор топика
Ответ на: комментарий от router

XML::XPath::Literal $VAR1 = bless( do{\(my $o = '348.00')}, 'XML::XPath::Literal' );

Operation "-": no method found, left argument in overloaded package XML::XPath::Literal, right argument has no overloaded magic at ./nova.pl line 57.

Как боротьто?

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

Ты тупо подставил '->value()' в 55 строку. Вообще не понимая, что ты делаешь. Хотя совет относился только к 40 строке, которую ты перечислил в заголовке темы

Знаешь, рано тебе читать «Программирование на perl». Начни с «Изучаем Perl»

Сначала пойми, с чем ты имеешь дело, а потом уже пытайся это что-то использовать.

Пример. Пояснения, надеюсь, не нужны?

#!/usr/bin/perl

use strict;
use Data::Dumper;

my $a=1;
my @b=(2,3,4);
my %c=(
    5 => 6,
    7 => 8
);

my $d = bless(\@b, 'test');

printf "lets see at a:\n";
printf "%s\n", ref($a);
printf "%s\n", ref(\$a);
printf "%s\n", Dumper($a);
printf "\n";

printf "lets see at b\n";
printf "%s\n", ref(@b);
printf "%s\n", Dumper(\@b);
printf "\n";

printf "lets see at c\n";
printf "%s\n", ref(\%c);
printf "%s\n", Dumper(\%c);
printf "\n";

printf "lets see at d\n";
printf "%s\n", ref($d);
printf "%s\n", Dumper($d);
printf "\n";

router ★★★★★
()
Ответ на: комментарий от router
router@amalthea:~$ perl test.pl 
lets see at a:

SCALAR
$VAR1 = 1;


lets see at b

$VAR1 = bless( [
                 2,
                 3,
                 4
               ], 'test' );


lets see at c
HASH
$VAR1 = {
          '7' => 8,
          '5' => 6
        };


router@amalthea:~$ perl test.pl 
lets see at a:

SCALAR
$VAR1 = 1;


lets see at b

$VAR1 = bless( [
                 2,
                 3,
                 4
               ], 'test' );


lets see at c
HASH
$VAR1 = {
          '7' => 8,
          '5' => 6
        };


lets see at d
test
$VAR1 = bless( [
                 2,
                 3,
                 4
               ], 'test' );

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

Ну или опустимся до уровня детского сада.

Компилятор ругается на то, что ты неправильно используешь переменную $b в строке 55. Закомментируй её

Поставь перед этой строкой

printf "%s\n", Dumper($b); # смотрим, с чем мы имеем дело
exit 1; # завершаем работу скрипта
router ★★★★★
()
Ответ на: комментарий от slon362

Ты таки почитай что такое XPath.

<root>
    <parentNode status="Good">
        <A>
            <B>
                <value>1</value>
            </B>
        </A>
    </parentNode>
</root>

#!/usr/bin/perl -w
use strict;
use utf8;
use XML::XPath;
use XML::LibXML;

my $parser = XML::LibXML->new();
my $tree = $parser->parse_file("file.xml");
my $root = $tree->getDocumentElement;

my $b=$root->findvalue('./parentNode/A/B/value');
my $c=$b -1;

print "c=$c,b=$b\n";
vitus@s1:~/devel/projects$ ./p.pl 
c=0,b=1

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

55 это бывшая 40 строка, просто ниже вывел подсчет этой переменной $b

$VAR1 = bless( do{\(my $o = '348.00')}, 'XML::XPath::Literal' );

вывод не поменялся от того что выше писал.

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