Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: hasownproperty в perl  (Прочитано 14560 раз)
0 Пользователей и 1 Гость смотрят эту тему.
perl6
Помогающий

ru
Offline Offline

« : 18-06-2017 21:37 » 

Приветствую. Есть ли что-то подобное в перл?
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 19-06-2017 00:54 » 

Смотря что считать property.
Если это ключ хеша, используй exists.
Если метод (возможно аксессор), используй метод can.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
perl6
Помогающий

ru
Offline Offline

« Ответ #2 : 19-06-2017 16:58 » 

Смотря что считать property.
Если это ключ хеша, используй exists.
Если метод (возможно аксессор), используй метод can.
Скорее всего, ключ хеша (в javascript, это объект). Спасибо. Я, кстати выбирал между exists или define.
« Последнее редактирование: 19-06-2017 17:04 от perl6 » Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 19-06-2017 20:09 » 

exists проверяет наличие ключа в хеше
define проверяет определенность значения (не undef)
Т.е. во втором случае будет поиск в хеше, копирование значения на стек и проверка, что значение это не undef. Первое явно короче.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
perl6
Помогающий

ru
Offline Offline

« Ответ #4 : 21-06-2017 16:46 » 

В общем, че-то ничего не получается, из-за проклятой обфускации. Кусок кода на js, в общем-то, работает, как надо, за искл. функции extend, которая не понятно как реализована, я ее просто экранировал. В остальном, работает.

Код: (Javascript)
var p = {
  p: 267249,
  b: 641991,
  f: "khf1hl",
  bf: "xvash",
  np: 1,
  hp: -1,
  p: 267249,
  r: 70991,
  render: "%7B%22i%22%3A0%2C%22o%22%3A0%2C%22w%22%3A1%2C%22m%22%3A0%2C%22a%22%3A0%2C%22mb%22%3A0%7D"
}

var n = function(n, o) {
    //n = e(!0, {}, n);
    var i, a, u, c, s, f = "qwertyuioasdfgjklzxcvnmQWERTYUIOASDFGJKLZXCVNM",
      l = "0123456789",
      d = o ? 2 : 0;
    for (c = 0; c <= e(7) + d; c++) {
      i = "",
        a = 0;
      for (var m = 0, p = 100; p > m; m++) {
        for (s = 0; s <= e(3); s++)
          u = e(f.length) - 1,
          i += f.substring(u, u + 1);
        if (!n.hasOwnProperty(i))
          break
      }
      for (s = 0; s <= e(7); s++)
        u = e(l.length) - 1,
        a += l.substring(u, u + 1);
      n[i] = a;
    }
    return r(n);
  },
  e = function(t) {
    return Math.round(Math.random() * t)
  },
  r = function(n) {
    var e = objectKeys(n);
    e.sort(function() {
      return .5 - Math.random()
    });
    for (var r = {}, o = 0, i = e.length; i > o; o++)
      r[e[o]] = n[e[o]];
    return r
  }

Пробую переписать под перл, не получается

Код: (Perl)
my %p = (
  'p' => '267249',
  'b' => '641991',
  'f' => 'khf1hl',
  'bf'=> 'xvash',
  'np' => '1',
  'hp' => '-1',
  'p' => '267249',
  'r' => '70991',
  'render' => '%7B%22i%22%3A0%2C%22o%22%3A0%2C%22w%22%3A1%2C%22m%22%3A0%2C%22a%22%3A0%2C%22mb%22%3A0%7D'
);

sub objectKeys($) {
  my($t) = @_;
  my $count;
  $count = (keys %$t);
  return $count
}

local $n = sub($$) {
      my ( $n, $o ) = @_;
      my $i, my $a, my $u, my $c, my $s, my $f = "qwertyuioasdfgjklzxcvnmQWERTYUIOASDFGJKLZXCVNM", my $l = "0123456789", my $d = $o ? 2 : 0;
      for ($c = 0; $c <= $e->(7) + $d; $c++) {
           $i = "",
           $a = 0;
                   for (my $m = 0, $p = 100; $p > $m; $m++) {          
                            for ($s = 0; $s <= $e->(3); $s++)          
                                        $u = $e->(length $f) - 1,
                    $i .= substr($f, $u, $u + 1);
                if (exists !$n($i))
                    last
           }
                   for ($s = 0; $s <= $e->(7); $s++)
                $u = $e->(length $l) - 1,
                $a .= substr($l, $u, $u + 1);
           $n[i] = $a
      }
      return $r(n)
},
      $e = sub($) {
          local ($t) = @_;
          return int(rand() * $t)
},
      $r = sub($) {
          local ($n) = @_;
          my $e = objectKeys(\%n);
      sort {return .5 - rand()} $e ;
      for (local $r = {}, $o = 0, $i = length $e; $i > $o; $o++)
                    $r[$e[o]] = $n[$e[o]];
                return $r
        },
    return $n
       
}

Роман, просьба глянуть, где ошибиться мог.

Суть то вот, в чем. Имеем хэш с определенными значениями, нужно в него рандомно нагенерить ключей с рандомными значениями и рандомно отсортировать эти ключи.
« Последнее редактирование: 21-06-2017 21:12 от RXL » Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 21-06-2017 21:16 » 

Ключевое слово local в Перл не аналог var. Используй my.
Очень рекомендую

Код: (Perl)
use strict;
use warnings;

Сразу все косяки вылезут.

И форматируй код.

Основные проблемы в том, что переменные используются до объявления.
Цитата
Код:
exists !$n($i)
Чего сказать то хотел? Синтаксическая ошибка.
« Последнее редактирование: 21-06-2017 21:23 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
perl6
Помогающий

ru
Offline Offline

« Ответ #6 : 23-06-2017 20:40 » 

Цитата: RXL
Ключевое слово local в Перл не аналог var. Используй my.
Очень рекомендую
Спасибо, добрый человек. А чем, кстати, отличается local и my? Областью видимости?

Цитата: RXL
Код: (Perl)
use strict;
use warnings;

Сразу все косяки вылезут.

И форматируй код.

Если использовать прагму strict, то уж больно часто интерпретатор ругается, предпочитаю -w. По поводу форматирования учту на будущее.

Цитата: RXL
Основные проблемы в том, что переменные используются до объявления.

Тоже верно, почему-то в жабаскрипте они объявлены уже после их фактического использования.

Цитата: RXL
Цитата
Код:
exists !$n($i)
Чего сказать то хотел? Синтаксическая ошибка.

Хотел сказать, выйти из цикла, когда ключи в хэше закончились, а то зацикливание происходит.
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 23-06-2017 22:23 » 

local управляет не видимостью имени переменной, а динамической видимостью значения переменной. Не любой: глобальные переменные и значения хешей и массивов.

$ perl -wE 'use strict; our $x = 111; sub pr { say $x } pr(); sub loc { local $x = 222; pr() } loc(); pr();'
111
222
111

$ perl -wE 'use strict; use DDP; sub pr { my ($name, $val) = @_; say "$name:"; p $val }; sub loc { my ($val) = @_; pr("loc before", $val); local $val->{a} = 222; pr("oc after", $val) } my $h = {a => 111, b => 333}; pr("main before", $h); loc($h); pr("main after", $h)'
main before:
\ {
    a   111,
    b   333
}
loc before:
\ {
    a   111,
    b   333
}
oc after:
\ {
    a   222,
    b   333
}
main after:
\ {
    a   111,
    b   333
}

perl -wE 'use strict; use DDP; sub pr { my ($name, $val) = @_; say "$name:"; p $val }; sub loc { my ($val) = @_; pr("loc before", $val); local $val->
  • = 222; pr("oc after", $val) } my $arr = [111, 333]; pr("main before", $arr); loc($arr); pr("main after", $arr)'
main before:
\ [
   
  • 111,
  • [1] 333
    ]
    loc before:
    \ [
       
  • 111,
  • [1] 333
    ]
    oc after:
    \ [
       
  • 222,
  • [1] 333
    ]
    main after:
    \ [
       
  • 111,
  • [1] 333
    ]
-w аналог "use warnings". strict - это совсем другое. А то что ругается, это говорит, что программа кривая. Как только перестанет ругаться, станет понятнее код и стабильнее работа.

Читай документацию. Javascript имеет спецификацию ECMA-262.

А где тут хеш, а где ключ? Я вижу две переменные: одна пытается представиться ссылкой на функцию (на что будет ругань под strict), другая просто передается параметром в функцию. Ключевой слово exists всю это хрень вообще не понимает.

$perl -wE 'say exists $n($i)'
exists argument is not a HASH or ARRAY element or a subroutine at -e line 1.

Хватит кнопки нажимать — иди улицу подметать!
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
perl6
Помогающий

ru
Offline Offline

« Ответ #8 : 25-06-2017 17:34 » 

Цитата
Хватит кнопки нажимать — иди улицу подметать!
Улицу пусть идут подметь бездари, а я в школе 10 лет учился (именно, учился, а не штаны просиживал), потом в технаре 3 года, да еще в университете 6 лет. Хотя, при нынешней власти, так и получается, люди с высшим техническим образованием вынуждены идти куда угодно, ибо все теплые местечки передаются по наследству, а есть хочется.
Между прочим, однокурсница закончила с красным дипломом, а работать пошла в МакДональдс. Хотя, в крупных городах - миллионниках, все не так. Речь то про засранные городишки, аулы.
Программирование, к слову, это мое хобби, а не работа. Пока другие ребята порнушку качали, да собакам хвосты крутили, я тух за компом.
Вы уж, уважаемый Роман, не судите строго, с высоты своего профессионализма.
Теперь по поводу основном темы, а то я отвлекся. В веб отладчике наконец-то разобрался с js, все путем. Даже, под  пёрлом все работало, правда с использованием либы V8. Очередной раз убеждаюсь, что гугловские продукты, это серьезно. Просто копирнул js код, обернул eval <code>и вуаля, отлично отработало. Скорость движка на высоте. Одна беда, под винду не собирается перловая обертка JavaScript::V8 (а отладка то скрипта-парсера под виндой).
Другие варианты, JavaScript::SpiderMonkey (под виндой с пердежом собрал, под самую старую версию движка, работать нормально отказывается с моим объемом, только с одной-двумя функциями), JavaScript::Lite (реализует только простейшие возможности, не подходит), JavaScript (под виндой собрать не реально, без вариантов), JavaScript::Shell (подходит для запуска каких-нибудь примитивных примеров, чисто поиграться, а у меня 5-6 функций, да еще многопоток, нужен доступ к либе, а не шеллу).
Вот так вот, потрачено пара ночей, вывод напрашивается неутешительный, надо переписывать код под пёрл.

П.С. За примеры спасибо, внимательно их изучаю.
« Последнее редактирование: 25-06-2017 17:38 от perl6 » Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 25-06-2017 20:09 » new

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

Под винду все время что-то не так. Поставил бы VirtualBox, туда Убунту и в ус не дул бы. Меньше трудозатраты.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
perl6
Помогающий

ru
Offline Offline

« Ответ #10 : 26-06-2017 01:22 » 

Все, эту тему можно закрывать, да и мою про javascript - тоже. Задача решена, довольно нетривиальным способом. Собственно, мучаясь довольно долго с js, прежде чем он у меня заработал в веб-отладчике, сидеть еще с пёрлом мудохаться. Половина функций у этих языков различаются, большинства js-х в пёрле вообще нет. В js имеем дело с объектом, в пёрле - с ассоциативным массивом.

Сразу возникла идея пойти другим путем, как оказалось, все-таки, не зря.

Так вот, с пердежом скомпилировал JavaScript::SpiderMonkey под винду, не самый свежий версии, тем не менее, проверил примерами с cpan'a - все работает. Компилировал обертку, кстати, под activeperl (сам движок собирал на виртуальной машине под VS 2013), не охото было переустанавливать, а компилировать под activeperl - тот еще геморрой (у них MinGW какой-то старый и кастрированный, всяких либ и заголовочных файлов не хватает).

Стал разбираться, почему мой код в нем не работает, оказалось, проблема именно в mozjs движке, не работает метод Object.keys (перебор свойств js объекта), не знаю, почему, но не работает. Кстати, этот метод прекрасно работает с js движком v8 от гугла.
Пришлось создать функцию:
Код:
function ObjectKeys(foo) {
      var keys = [],
        i = 0;
      for (keys[i++] in foo) {}
      return keys
    }

после, все заработало.

Буду рад, если кто потом нагуглит эту тему, чтоб как я не сидел три ночи.

Цитата
Наверно я зря ругаюсь, извини. Но честно и откровенно: я бы такого работника сам знаешь куда бы послал.
Ну да, у вас же работники профи, чтобы так на вскидку, один язык  запросто перевести в другой, минут, так, за пятнадцать. Я, кстати, и не обижался, извиняться не за что.
Просто, подумал, вот я имею код на js, взять бы и запихнуть его в родную среду, а потом пёрлом подрубиться и вытащить значение.
Под линуксом, данный вариант решения заработал сразу. Там - вообще нет проблем с компиляцией. Под виндой, пришлось посидеть.

Цитата
Под винду все время что-то не так. Поставил бы VirtualBox, туда Убунту и в ус не дул бы. Меньше трудозатраты.
Возможно, тем не менее, у меня комп то старый, всего 4 Гб ОЗУ, из них, только 3,2 Гб видит винда.
Виртуальную машину поставишь, потом две-три вкладки броузера откроешь и, все, повиснет.
« Последнее редактирование: 26-06-2017 01:33 от perl6 » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines