Задача: иметь несколько файлов для разной «целевой аудитории» (на разных языках человеческих). Файлы большие, перевод построчный — желательно иметь соот. строки перед глазами для правок.
Решение: делаем файл "test"
all langs ru:Только русский en:English only Ещё раз для всех !ru:not for russian eo:Esperanto!и программу на перле:
1 #!/usr/bin/perl -T
2
3 use utf8;
4 use strict;
5 use warnings;
6 use integer;
7 use open qw( :utf8 :std :encoding(UTF-8) );
8 use Getopt::Long qw(:config bundling);
9
10 my @LANGS = ();
11 my $opt_LANGS = '';
12 my $opt_SEP = ':';
13
14 GetOptions(
15 'language|l=s' => \$opt_LANGS,
16 'separator|s=s' => \$opt_SEP,
17 'delimiter|d=s' => \$opt_SEP
18 );
19
20 @LANGS = split(/[, ]/, $opt_LANGS);
21
22 sub have_shared
23 {
24 my ($array, $ARRAY) = @_;
25 foreach my $a (@$array)
26 {
27 return $a if (grep($a eq $_, @$ARRAY));
28 }
29 return '';
30 }
31
32 while (my $line = <STDIN>)
33 {
34 # en, eo: Text => $lang_spec = 'en, eo'; $pure_line = Text;
35 my ($lang_spec, $pure_line) = split(/[$opt_SEP]/, $line, 2);
36 if (!$pure_line) {$pure_line = $lang_spec; $lang_spec = ''};
37
38 # ! в начале строки - не выводить строку для указанных языков
39 my $pos = 0;
40 $lang_spec =~ s,^\s*(\!),,; # заодно удаляем !
41 $pos ||= $1;
42
43 # Список языков для строки
44 my @langs = split(/[, ]/, $lang_spec);
45
46 # первый общий элемент или пустая строка, если нет общих
47 my $matches = have_shared(\@langs, \@LANGS);
48
49 if ((!$pos && $matches) || ($pos && !$matches) || !$lang_spec)
50 {print $pure_line};
51 }
52
53 exit 0;
54
Проверяем:
# ./babelgrep -l ru < test all langs Только русский Ещё раз для всех # ./babelgrep -l en < test all langs English only Ещё раз для всех not for russian # ./babelgrep -l en,ru < test all langs Только русский English only Ещё раз для всех # ./babelgrep -l eo < test all langs Ещё раз для всех not for russian Esperanto!