Автор Тема: непонятная конструкция Perl  (Прочитано 5934 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн woolfs

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 2
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
непонятная конструкция Perl
« : 15 Апреля 2008, 07:47:32 »
Добрый день!
Портирую функционал с Perl под .Net
Во всех ньюансах Perl, еще слабо разбираюсь.
Прошу объяснить на псевдокоде смысл следующей конструкции:
$$ngram{substr($word,$i,4)}++ if $len 3;

где ngram это хэш,  а $len=length($word);

В конструкции непонятен смысл постфиксного условия if
и чем будет отличаться идея, если бы он стоял в начале конструкции?

Оффлайн arto

  • Ветеран
  • *****
  • Сообщений: 699
  • +0/-0
  • 2
    • Просмотр профиля
непонятная конструкция Perl
« Ответ #1 : 15 Апреля 2008, 08:07:16 »
он был бы синтаксически неверен.
правильно:
if ($len > 3) {
$$ngram{substr($word,$i,4)}++;
}

Оффлайн woolfs

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 2
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
непонятная конструкция Perl
« Ответ #2 : 15 Апреля 2008, 08:21:51 »
спасибо за отклик, но этот пример работает :
вот более полный фрагмент
my $t1 = new Benchmark;
  my $ngram;
  ($_,$ngram) = @_;  #$ngram contains reference to the hash we build
    # then add the ngrams found in each word in the hash
  my $word;
  foreach $word (split("[$non_word_characters]+")) {
    $word = "_" . $word . "_";
            print "\\ntest=".$word;
    my $len = length($word);
    my $flen=$len;
    my $i;

    for ($i=0;$i<$flen;$i++) {
     
   $$ngram   {substr($word,$i,5)}++ if $len > 4;
   $$ngram{substr($word,$i,4)}++ if $len > 3;
   $$ngram{substr($word,$i,3)}++ if $len > 2;
   $$ngram{substr($word,$i,2)}++ if $len > 1;
   $$ngram{substr($word,$i,1)}++;
      $len--;
    }
  }

Оффлайн arto

  • Ветеран
  • *****
  • Сообщений: 699
  • +0/-0
  • 2
    • Просмотр профиля
непонятная конструкция Perl
« Ответ #3 : 15 Апреля 2008, 10:35:36 »
попробуйте  if ($len > 3) $$ngram{substr($word,$i,4)}++;

Оффлайн Harvester

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 123
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
непонятная конструкция Perl
« Ответ #4 : 15 Апреля 2008, 12:41:43 »
И так и так будет работать - разницы никакой.

Цитировать
if $len > 3;


Просто чтобы не городить цикл for или if в той же строке пишут в конце условие, например:

$forconst{$u} = [$y[$_]] for $_ 1..10;
Если ты не один, значит... ты ноль!

Оффлайн arto

  • Ветеран
  • *****
  • Сообщений: 699
  • +0/-0
  • 2
    • Просмотр профиля
непонятная конструкция Perl
« Ответ #5 : 15 Апреля 2008, 12:59:26 »
неужели?

# perl -l
my $t = 1;
if ($t == 1) print "yes!";
^D
syntax error at - line 2, near ") print"
Execution of - aborted due to compilation errors.
#

Оффлайн Harvester

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 123
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
непонятная конструкция Perl
« Ответ #6 : 15 Апреля 2008, 14:01:52 »
Да ни... если if ставить в начале, то оформлять нужно так:

if ($t == 1) {print "yes!";}
Если ты не один, значит... ты ноль!

Оффлайн arto

  • Ветеран
  • *****
  • Сообщений: 699
  • +0/-0
  • 2
    • Просмотр профиля
непонятная конструкция Perl
« Ответ #7 : 15 Апреля 2008, 14:10:36 »
и чем отличается от того, что я написал?

Оффлайн Harvester

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 123
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
непонятная конструкция Perl
« Ответ #8 : 15 Апреля 2008, 15:48:28 »
Цитировать
arto:
и чем отличается от того, что я написал?


Тем, что мой пример работать будет и error не выдаст:)
Если ты не один, значит... ты ноль!

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28