Perl: основной вопрос, функциональность - PullRequest
1 голос
/ 27 ноября 2010

Что делает эта функция?

    sub MyDigit {
       return <<END;
       0030\t0039
       END
    }

Ответы [ 5 ]

8 голосов
/ 27 ноября 2010

Это называется "here-document" и используется для разбиения строк на несколько строк в качестве альтернативы операциям конкатенации или списка:

print "this is ",
    "one line when printed, ",
    "because print takes multiple ",
    "arguments and prints them all!\n";
print "however, you can also " .
    "concatenate strings together " .
    "and print them all as one string.\n";

print <<DOC;
But if you have a lot of text to print,
you can use a "here document" and create
a literal string that runs until the
delimiter that was declared with <<.
DOC
print "..and now we're back to regular code.\n";

Подробнее о документах здесь можно прочитать в руководстве: см. perldoc perlop .

7 голосов
/ 28 ноября 2010

Вы все упустили момент!

Определяет пользовательское свойство для использования в \p{MyDigit} и \P{MyDigit} с использованием регулярных выражений.

Это так:

  sub InKana {
      return <<'END';
  3040    309F
  30A0    30FF
  END
  }

Кроме того, вы можете определить его в терминах существующих имен свойств:

  sub InKana {
      return <<'END';
  +utf8::InHiragana
  +utf8::InKatakana
  END
  }

Вы также можете установить вычитание, используя префикс "C <->". Предположим, вы только хотел реальные символы, а не только диапазоны блоков символов. Вы можете отсеять все неопределенные, как это:

  sub IsKana {
      return <<'END';
  +utf8::InHiragana
  +utf8::InKatakana
  -utf8::IsCn
  END
  }  

Вы также можете начать с дополненного набора символов, используя префикс "C":

  sub IsNotKana {
      return <<'END';
  !utf8::InHiragana
  -utf8::InKatakana
  +utf8::IsCn
  END
  }

Я полагаю, я должен быть прав, поскольку я говорю ex camelis . :)

2 голосов
/ 27 ноября 2010

Возвращает строку "0030\t0039\n" (\t - табуляцию и \n - новую строку, которая добавляется, потому что строка заканчивается новой строкой (очевидно)).

<<FOO
sometext
FOO

Это так называемый heredoc, способ удобного написания многострочных строк (хотя здесь он используется только с одной строкой).

2 голосов
/ 27 ноября 2010

Он использует нечто, называемое Здесь Document , чтобы вернуть строку "0030 \ t0039"

0 голосов
/ 27 ноября 2010

Вы можете помочь себе, попробовав простой эксперимент:

C:\Temp> cat t.pl
#!/usr/bin/perl

use strict; use warnings;

print MyDigit();

sub MyDigit {
    return <<END;
    0030\t0039
END
}

Вывод:

C:\Temp> t | xxd
0000000: 2020 2020 3030 3330 0930 3033 390d 0a        0030.0039..

Теперь, в вашем случае, END не выстроено в началелинии, поэтому вы должны были получить сообщение:

Can't find string terminator "END" anywhere before EOF at &hellip;
...