Perl: Как определить, какой файл существует среди foo. (Txt | abc) - PullRequest
0 голосов
/ 26 октября 2011

Мой скрипт на perl должен определить расширение существующего файла и распечатать имя файла.Входные данные, которые задают имя файла с неопределенным расширением, будут иметь следующий формат:

foo.(txt|abc)

, и сценарий выведет «foo.txt», если он существует.Если foo.txt не существует, а foo.abc существует, то он напечатает «foo.abc».

Как я могу сделать это обнаружение и печать правильного существующего файла аккуратным и чистым способом?1006 *

Спасибо!

Ответы [ 4 ]

3 голосов
/ 26 октября 2011

На самом деле, вы почти получили правильное выражение: единственное, что вам нужно сделать, это экранировать . с обратной косой чертой (поскольку . означает «любой символ, кроме символа новой строки» в регулярных выражениях) и это также поможет поместить ?: в скобки (так как вам не нужно фиксировать расширение файла). Кроме того, ^ и $ обозначают маркеры для начала и конца строки (поэтому мы сопоставляем всю строку, а не только часть строки ... таким образом, мы не получаем соответствия для имя файла "thisisnotfoo.txt")

Как-то так должно работать:

use strict;
use warnings;

my $file1="foo.txt";
my $file2="foo.abc";
my $file3="some_other_file";

foreach ($file1,$file2,$file3)
{
  if(/^foo\.(?:txt|abc)$/)
  {
    print "$_\n";
  }
}

Когда выполняется приведенный выше код, вывод:

foo.txt
foo.abc

Посмотрите на perldoc perlretut, чтобы узнать больше о регулярных выражениях.

0 голосов
/ 27 октября 2011
use strict;
use warnings;

FILE:
for (glob "file.{txt,abc}") {
  if (-f $_) {
    print $_, "\n";
    last FILE;
  }
}
0 голосов
/ 27 октября 2011
sub text_to_glob {
    my ($s) = @_;
    $s =~ s/([\\\[\]{}*?~\s])/\\$1/g;
    return $s;
}

my $pat = 'foo.(txt|abc)';

my @possibilities;
if (my ($base, $alt) = $pat =~ /^(.*\.)\(([^()]*)\)\z/s) {
   @possibilities =  glob(
      text_to_glob($base) .
      '{' . join(',', split(/\|/, $alt)) . '}'
   );
} else {
   @possibilities = $pat;
}

for my $possibility (@possibilities) {
   say "$possibility: ", -e $possibility ? "exists" : "doesn't exist";
}
0 голосов
/ 26 октября 2011

Возможно, вы захотите взглянуть на glob , но вам придется использовать другой синтаксис. Эквивалент будет:

foo.{txt,abc}

См. File :: Glob для получения дополнительной информации. Также обратите внимание, что при этом будет возвращен список всех совпадений, поэтому вам придется применять свои собственные правила, если он предпочтет один, когда существует несколько.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...