Как разделить строку в Perl на 2 части

поэтому мне нужно разделить мою строку в Perl на 2 части. Например, у меня есть:

$string = "../dira/dirb/*.txt"

И я хочу разделить его на:

$stringA = "../dira/dirb"
$stringB = "*.txt"

Но если у меня есть:

$string = "dira/dirb/dirc/.../dirn/test.pl";

Я хочу разделить это на:

$stringA = "dira/dirb/dirc/.../dirn"
$stringB = "test.pl"

У кого-нибудь есть идеи, как я могу это сделать? Я попытался сделать что-то вроде:

$howmany++ while $string =~ m/\//g;

Так что я знаю, сколько у меня косых черт. Но я понятия не имею, что я могу сделать с этим еще :/


person Mateusz    schedule 04.05.2015    source источник


Ответы (3)


вы можете попробовать что-то вроде этого:

$string =~ m|^(.*)/(.*)$|;
($stringA,$stringB) = ($1,$2);
print "stringA = $stringA\n";
print "stringB = $stringB\n";

= изменить: =

ограничиться определенными значениями stringB:

if($string =~ m|^(.*)/(.*\.pl)$|) {
    ($stringA,$stringB) = ($1,$2);
    print "stringA = $stringA\n";
    print "stringB = $stringB\n";
}
person leu    schedule 04.05.2015
comment
У вас есть идеи, как я могу использовать строку B, например, *.pl? - person Mateusz; 04.05.2015
comment
Я имею в виду, что я хочу напечатать символ * как StringB :P Потому что, когда я использую, например: perl lab2.pl ./e.pl, он работает нормально и показывает мне. как stringA и e.pl как stringB. Но когда я использую perl lab2.pl ./*.pl, он показывает мне . как stringA и lab2.pl как stringB, и я хочу иметь *.pl как stringB. - person Mateusz; 04.05.2015

Используйте Path::Tiny:

#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };

use Path::Tiny;

for my $path (qw( ../dira/dirb/*.txt
                  dira/dirb/dirc/.../dirn/test.pl
             )) {
    my $path_o = 'Path::Tiny'->new($path);
    my $basename = $path_o->basename;
    my $dirname = $path_o->dirname;
    $dirname =~ s=/$==;               # Remove the trailing slash.
    say $basename, ' ', $dirname;
}
person choroba    schedule 04.05.2015
comment
Спасибо за помощь, но я забыл сказать, что не могу использовать что-либо вроде use XXX::YYY :P - person Mateusz; 04.05.2015

Вы можете использовать функции File::Basename для анализа путей к файлам:

#!/usr/bin/env perl
use strict;
use warnings;
use File::Basename;

my $string = "../dira/dirb/*.txt";
my $stringA = dirname($string);
my $stringB = basename($string);

printf "String A: %-25sString B: %s\n", $stringA, $stringB;

$string = "dira/dirb/dirc/.../dirn/test.pl";
$stringA = dirname($string);
$stringB = basename($string);

printf "String A: %-25sString B: %s\n", $stringA, $stringB;
person fvox    schedule 04.05.2015