Как распечатать то, что находится между определенным числом обратных косых черт (Perl) - PullRequest
1 голос
/ 06 сентября 2011

У меня есть URL-адрес, похожий на

//google.com/Ucomm/Photos/1984 Digital Photos/blah blah/Reflections Magazine/Fall 1984    issue/This is what I want 7-28/TMI_7840_xx.PNG

Каждый URL отличается, но я хочу получить из него ту же часть, которая была бы частью прямо перед именем файла.
Я подумал, если япосчитал количество обратных косых черт, которые я мог напечатать, что находится между вторым и последним и последним ..

Таким образом, результат будет выглядеть как

This is what I want 7-28

То, что я до сих пор считаетколичество обратных косых черт, но я не уверен, как распечатать то, что мне нужно.

Код:

my $string = $cells[74];
my $count = lc($string) =~ tr/\///;
print $count;

Ответы [ 5 ]

6 голосов
/ 06 сентября 2011

Вам не нужно считать косые черты (а это косые черты, а не обратные), просто начинайте с конца и работайте в обратном направлении.

#!/usr/bin/perl

use strict;
use warnings;
use v5.10;

my $string = "//google.com/Ucomm/Photos/1984 Digital Photos/blah blah/Reflections Magazine/Fall 1984    issue/This is what I want 7-28/TMI_7840_xx.PNG";

say "Version 1";
{
        my @parts = split '/', $string;
        say $parts[-2];
}

say "Version 2"; # if you love regular expressions
{
        my ($captured) = $string =~ m!/([^/]+)/[^/]+$!;
        say $captured;
}
2 голосов
/ 06 сентября 2011

Вы можете использовать split

my @data = split('/', $string);
print $data[-2];
2 голосов
/ 06 сентября 2011

Вы можете использовать basename и dirname для этого:

use File::Basename;

my $str="//google.com/Ucomm/Photos/1984 Digital Photos/blah blah/Reflections Magazine/Fall 1984    issue/This is what I want 7-28/TMI_7840_xx.PNG";

print basename(dirname($str));

В качестве альтернативы, split строка в / и взять элемент перед последним.

0 голосов
/ 06 сентября 2011

Вы можете использовать регулярное выражение:

if ($str=~/([^\/]*)\/([^\/]*)$/) {
   print "$1\n"
} else {
   print "ERROR\n"
}

Пример:

perl -e '$str="google.com/Ucomm/Photos/1984 Digital Photos/blah blah/Reflections Magazine/Fall 1984    issue/This is what I want 7-28/TMI_7840_xx.PNG"; if ($str=~/([^\/]*)\/([^\/]*)$/) {print "$1\n"} else {print "ERROR\n"}'

This is what I want 7-28
0 голосов
/ 06 сентября 2011

Разбить входные данные в массив.Вопрос в том, как определить поле, которое вы хотите?По должности?

    #!/usr/bin/env perl

    use strict;
    use warnings;

    use Data::Dumper;

    # Make Data::Dumper pretty
    $Data::Dumper::Sortkeys = 1;
    $Data::Dumper::Indent   = 1;

    # Set maximum depth for Data::Dumper, zero means unlimited
    local $Data::Dumper::Maxdepth = 0;

    my $string = '//google.com/Ucomm/Photos/1984 Digital Photos/blah blah/Reflections Magazine/Fall 1984    issue/This is what I want 7-28/TMI_7840_xx.PNG';

    my @array = split /\//, $string;
    print Dumper \@array;

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