[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: [знатокам perl] русский в регулярных выражениях (bug#486877)



В Sat, 6 Nov 2010 13:38:24 +0300
Yuri Kozlov <yuray@komyakino.ru> пишет:
> 
> Угум, теперь правильно. Осталось побороть привязку к utf8.

Сделал патчик для adduser. Вроде работает.
Поглядите, особенно случаи, когда модули не найдены (в перлах не силён и shift для меня вообще открытие).
Тестировать просто:
adduser newuser
и на вопрос
Is the information correct? [Y/n]

ответить Н.
Должна опять начать задавать вопросы.

Интересно как работает, если KOI8-R или немецкая локаль (ja, ja натюрлих).

-- 
Best Regards,
Yuri Kozlov

--- adduser-3.112+nmu1/adduser	2010-11-06 09:23:48.000000000 +0300
+++ /usr/sbin/adduser	2010-11-06 15:17:55.000000000 +0300
@@ -35,7 +35,7 @@
 use Getopt::Long;
 
 
-my $version = "VERSION";
+my $version = "3.112+nmu1";
 
 ###################
 # return values
@@ -66,18 +66,25 @@
     }
     eval {
 	require I18N::Langinfo;
-	import I18N::Langinfo qw(langinfo YESEXPR NOEXPR);
+	import I18N::Langinfo qw(langinfo CODESET YESEXPR NOEXPR);
     };
     if ($@) {
 	*langinfo = sub { return shift; };
 	*YESEXPR  = sub { "^[yY]" };
 	*NOEXPR   = sub { "^[nN]" };
+        *CODESET  = sub { "" };
+    }
+    eval {
+	use Encode qw(decode);
+    };
+    if ($@) {
+       *decode = sub { shift; return shift; };
     }
 }
 
 setlocale(LC_MESSAGES, "");
 textdomain("adduser");
-my $yesexpr = langinfo(YESEXPR());
+my $yesexpr = decode(langinfo(CODESET()), langinfo(YESEXPR()));
 
 my %config;			# configuration hash
 
@@ -531,7 +538,7 @@
     create_homedir (1); # copy skeleton data
 
     # useradd without -p has left the account disabled (password string is '!')
-    my $yesexpr = langinfo(YESEXPR());
+    my $yesexpr = decode(langinfo(CODESET()), langinfo(YESEXPR()));
     if ($ask_passwd) {
 	for (;;) {
           my $passwd = &which('passwd');
@@ -554,6 +561,7 @@
 	    # expression will be checked to find positive answer.
 	    print (gtx("Try again? [y/N] "));
 	    chop ($answer=<STDIN>);
+            $answer = decode(langinfo(CODESET()), $answer);
 	    last if ($answer !~ m/$yesexpr/o);
 	  }
 	  else {
@@ -571,7 +579,7 @@
 	&ch_gecos($new_gecos);
     }
     else {
-	my $noexpr = langinfo(NOEXPR());
+	my $noexpr = decode(langinfo(CODESET()), langinfo(NOEXPR()));
 	for (;;) {
            my $chfn = &which('chfn');
 	    &systemcall($chfn, $new_name);
@@ -580,6 +588,7 @@
 	    # expression will be checked to find positive answer.
 	    print (gtx("Is the information correct? [Y/n] "));
 	    chop (my $answer=<STDIN>);
+            $answer = decode(langinfo(CODESET()), $answer);
 	    last if ($answer !~ m/$noexpr/o);
 	}
     }

Reply to: