Регулярное выражение Perl не соответствует апострофу

Это абсолютно действительные разрешения, они просто не позволяют вам их читать :). С точки зрения tar, конечно, это фича? Но в архиве звучит лажа.

Реумаск, я полагаю, что объяснение здесь правильное; umask — это чисто вычитающая вещь (или битовая маска, если вы программист ). Нет смысла говорить, что umask не применяется на том основании, что отсутствуют биты разрешения.

Чтобы предоставить разрешение на выполнение для всех каталогов, вы можете удобно использоватьchmod -R a+X EasyExtend-3.0.2-py2.5

0
06.07.2019, 23:20
1 ответ

Не используйте строки для построения регулярных выражений, используйте qr//. Есть одно важное отличие :при объединении двух регулярных выражений, созданных qr//, каждое из них сначала оборачивается (?:...). Когда две строки объединяются, вы просто получаете строку, содержащую первую строку, за которой следует вторая. Но $baseсодержит символ вертикальной черты, диапазон которого будет ограничен закрывающим (?:...). См.

my $s = "A',";
my $r = 'A|\{';

print $s =~ $_ ? 1 : 0
    for qr/$r,/,      # 1
        qr/(?:$r),/;  # 0

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

my $r = 'A';
my $s = '$r';
print "A" =~ /$s/;  # Doesn't match.

Более того, \1в строке в двойных кавычках (и замена в подстановке ведет себя как строка в двойных кавычках )означает chr(1).Perl использует $1для ссылки на первую подходящую группу. Но опять же, использование переменной, содержащей $1, не расширит ее, так как происходит только один уровень интерполяции.

my $s = 'ABC';
my $r = '$1';
say $s =~ s/(A)BC/$r/r;  # $1

Вы можете использовать модификатор /eeдля принудительной второй интерполяции, но тогда замещающая часть должна быть синтаксически написана на языке Perl, например.

my $s = 'ABC';
my $r = '"(". $1. ")"';
say $s =~ s/A(B)C/$r/ree;  # (B)
6
28.01.2020, 02:14

Теги

Похожие вопросы