Perl, как получить имя файла и расширение - PullRequest
0 голосов
/ 29 апреля 2019

У меня есть входной файл с именем test1.txt с сотнями и тысячами имен файлов.

test word document.docx
...
...
amazing c. document.docx
1. 2. 3.45 document.docx
...
...

Что я хочу сделать, это получить имя файла и расширение из строки. Для большинства имен файлов есть только одна точка, поэтому я могу получить имя файла и ext, используя точку в качестве разделителя. Но проблема в том, что некоторые имена файлов имеют несколько точек в именах файлов. Я понятия не имею, как я могу получить расширение и имя файла из этого.

Вот мой Perl-код.

use strict;
use warnings;

print "Perl Starting ... \n\n"; 

open my $input_filehandle1, , '<', 'test1.txt' or die "No input Filename Found test1.txt ... \n";

while (defined(my $recordLine = <$input_filehandle1>))
{
    chomp($recordLine);

    my @fields = split(/\./, $recordLine);
    my $arrayCount = @fields;


    #if the array size is more than 2 then we encountered multiple dots
    if ($arrayCount > 2)
    {
        print "I dont know how to get filename and ext ... $recordLine ... \n";
    }
    else
    {   
        print "FileName: $fields[0] ... Ext: $fields[1] ... \n";
    }

}#end while-loop

print "\nPerl End ... \n\n"; 

1;

Вот вывод:

Perl Starting ...

FileName: test word document ... Ext: docx ...
I dont know how to get filename and ext ... amazing c. document.docx ...
I dont know how to get filename and ext ... 1. 2. 3.45 document.docx ...

Perl End ...

Что бы я хотел получить

FileName: test word document ... Ext: docx ...
FileName: amazing c. document ... Ext: docx ...
FileName: 1. 2. 3.45 document ... Ext: docx ...

Ответы [ 2 ]

4 голосов
/ 29 апреля 2019

Для этого File :: Basename .

#!/usr/bin/perl

use strict;
use warnings;
use feature 'say';

use File::Basename;

while (<DATA>) {
  chomp;
  my ($name, undef, $ext) = fileparse($_, '.docx');

  say "Filename: $name ... Ext: $ext";
}

__DATA__
test word document.docx
amazing c. document.docx
1. 2. 3.45 document.docx

Три вещи, которые стоит объяснить.

  1. Я использую DATAfilehandle, так как это демонстрация, и это проще, чем отдельный входной файл.
  2. fileparse() возвращает путь к каталогу в качестве второго значения.Поскольку эти данные не включают пути к каталогам, я проигнорировал это значение (присвоив его undef).
  3. Второй (и последующие) параметры для fileparse() представляют собой список расширений для разделенияиз.Вы используете только одно расширение в ваших данных образца.Если у вас есть дополнительные расширения, вы можете просто добавить их после ".docx".
2 голосов
/ 29 апреля 2019

Не используйте split.

Используйте только регулярное сопоставление с шаблоном:

#! /usr/bin/perl
use strict;
use warnings;

print "Perl Starting ... \n\n"; 

open my $input_filehandle1, , '<', 'test1.txt' or die "No input Filename Found test1.txt ... \n";

while (defined(my $recordLine = <$input_filehandle1>))
{
    chomp($recordLine);

    if ($recordLine =~ /^(.*)\.([^.]+)$/) {
      print "FileName: $1 ... Ext: $2 ... \n";
    }

}#end while-loop

print "\nPerl End ... \n\n"; 

1;

Регулярный оператор объясняет регулярное выражение .

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