?

Log in

No account? Create an account
sub dec2bin {
    my $str = unpack("B32", pack("N", shift));
    $str =~ s/^0+(?=\d)//;   # інакше отримаємо 0 на початку
    return $str;
}

sub bin2dec {
    return unpack("N", pack("B32", substr("0" x 32 . shift, -32)));
}

Сподіваюсь комусь знадобиться :)

UTF-8 в perl

Unicode - це круто.

Завдяки йому я можу використовувати рідну мову в perl.

Перш за все у вас повинна бути виставлена коректна локаль, наприклад uk_UA.UTF-8.
По-друге, ваш термінал повинен підтримувати мультибайтові символи.

Далі йдуть фрагменти, що дають уяву про роботу з UTF-8 у perl.
Додаймо трохи директив:

use locale;
use utf8;


Зробимо так, щоб на вихід також ішов unicode.
binmode STDOUT, ":utf8";


Відкриваймо файл в режимі Unicode.

open($in, '
[Error: Irreparable invalid markup ('<:utf8',>') in entry. Owner must fix manually. Raw contents below.]

Unicode - це круто.

Завдяки йому я можу використовувати рідну мову в perl.

Перш за все у вас повинна бути виставлена коректна локаль, наприклад uk_UA.UTF-8.
По-друге, ваш термінал повинен підтримувати мультибайтові символи.

Далі йдуть фрагменти, що дають уяву про роботу з UTF-8 у perl.
Додаймо трохи директив:

<pre>
use locale;
use utf8;
</pre>

Зробимо так, щоб на вихід також ішов unicode.
<pre>
binmode STDOUT, ":utf8";
</pre>

Відкриваймо файл в режимі Unicode.

<pre>
open($in, '<:utf8', $filename) or die "Cannot open file $filename";
</pre>

Приклад роботи з регулярними виразами:

<pre>
while ( $line =~ /(\X)/g ) {
$ch = $1;
}
</pre>

Додавайте свої поради з використання Unicode.

There's More Than One Brain Dead Way To Do It

або 4 способи зробити одне і те ж на мові богів.

Підозрюю, що справжній гуру міг привести ще з десяток, але залишимо критику на совісті інших.

Отже задача: є скаляр-рядок, потрібно над кожним символом виконати певну операцію (в оригіналі стояло завдання підрахунку статистики літер у тексті). На С чи іншій "звичайній" мові це виглядало б приблизно так (код не претендує на коректність синтаксису):

// опускаємо деталі
int i;
for (i = 0; i < strlen(str); i++) {
    count_letter(s[i]);    // міфічна функція
}


Будь-які логічні шляхи написати щось подібне на Perl було вичерпано впродовж перших півгодини.
Після цього я поліз на http://perldoc.perl.org/ в пошуках функції чи якогось іншого солюшену.
Потім був Гугл. Ну а далі був #perl на irc.freenode.net.

Результат:

1. chop - повертає той символ, що видаляє

use strict;
use warnings;

my $str = $ARGV[0];
my $ch;

while ($ch = chop $str) {
	print $ch . " ";
}
print "\n";



2. substr - повертає підрядок аргументу

use strict;
use warnings;

my $str = $ARGV[0];
my $pos = 0;

while ($pos < length ($str) ) {
    print substr($str, $pos++, 1) . " "
}
print "\n";


3. split - зводимо задачу до відомої

use strict;
use warnings;

my $str = $ARGV[0];

foreach (split('', $str)) {
    print $_ . " ";
}   
print "\n";


4. регекспи. Use the Force, Luke.

use strict;
use warnings;

my $str = $ARGV[0];

while ($str =~ /(.)/g ) {
    print $1 . " ";
}   
print "\n";


5. Був ще 5ий спосіб, який мені порекомендували в IRC #perl тоді, коли посилали мене нафіг. Але я ще не доріс до його розуміння і не зміг запам'ятати той набір символів :). На жаль не зберігся.
Сьогодні задався цілью знайти спосіби як в звичайний perl-скрипт вставити запрос паролю. Взагалі, погодьтесь, річ звичайна.
Отже очевидним і найпростішив виявився метод просто вимкнути вивід на екран будь-чого, що вводить користувач (так само наприклад,  коли ви вводите пароль в Linux чи Unix систему в консолі):


  1. system "stty -echo";
    print "Password: ";
    chomp($passwd = <STDIN>);
    print "\n";
    system "stty echo";
    print $passwd;

  2. або:

  3. use Term::ReadKey;

    system "stty -echo";
    print "Password: ";
    $passwd = ReadLine(0);
    print "\n";
    system "stty echo";
    print $passwd;

Але мене цікавило як зробити так щоб замість букв виводити якийсь знак (наприклад "*"). Через деякий час пошук дав позитивний результат. Прошу подивитися на цей практично досконалий код:
    use IO::Prompt;

    $passwd = prompt -echo=>'*', 'Password: ';
    print $passwd;
Reference:

There's More Than One Way To Do It

Привіт усім хто любить цю чудову мову програмування. Ця спільнота призначена для того щоб однодумці могли зібратися в одному місці допомагати один одному в пошуках нестандартних рішень. Адже не забуваймо що "Існує більш ніж один спосіб зробити це" :-)

Якщо у Вас є якісь зауваження чи побажання - прошу пишіть коментарі у цей пост. Буду радий будь-якій конструктивній пораді...
Завчасно вдячний.