Как заменить последний символ строки новой строкой в ​​Perl - PullRequest
0 голосов
/ 25 марта 2020

Я перебираю лист Excel в одном столбце B. Если ячейка содержит ", то замените ее на Inches. Однако при использовании функции substr $newval остается пустым. В тестовом прогоне оба значения $cell и $ind содержат правильные значения. У меня нет ошибок и предупреждений.

Почему $newval пусто? Я нашел этот пример substr онлайн и не могу понять, что я делаю по-другому:

Альтернативой использованию substr в качестве lvalue является указание строки замены в качестве 4-го аргумента. Это позволяет вам заменить части EXPR и вернуть то, что было раньше в одной операции, точно так же, как вы можете с помощью соединения.

    my $s = "The black cat climbed the green tree";
    my $z = substr $s, 14, 7, "jumped from";    # climbed
    # $s is now "The black cat jumped from the green tree"

Вот мой код:

    ...

    if($sheet->Range("B". $i)->{Value} =~ m/\"/)
    {
                    my $cell = $sheet->Range("B". $i)->{Value};
                    print $cell . "\n"; # Notebook 24"
                    my $ind = index($cell, '\"');
                    print $ind ."\n";   # -1                        
                    my $newval = substr($cell, $ind, 0, " Inches");
                    print $newval . "\n"; # (blank)
                    <STDIN>;
                    $sheet->Range("B". $i)->{Value} = $newval;                      
    }

    ...

РЕДАКТИРОВАТЬ: (ДОБАВИТЬ ПРИМЕР ВЫХОДА В КОНСОЛЕ) enter image description here

РЕДАКТИРОВАТЬ 2: (УКАЗАТЬ СЕЙЧАС ПОЗИТИВНО И ПРАВИЛЬНО)

...

if($sheet->Range("B". $i)->{Value} =~ m/\"/)
{
                my $cell = $sheet->Range("B". $i)->{Value};
                print $cell . "\n"; # Notebook 24"
                my $ind = index($cell, '"');
                print $ind ."\n";  # 11                       
                my $newval = substr($cell, $ind, 0, " Inches");
                print $newval . "\n"; # (blank)
                <STDIN>;
                $sheet->Range("B". $i)->{Value} = $newval;                       
}

...

ВЫХОД КОНСОЛИ:

enter image description here

Ответы [ 2 ]

3 голосов
/ 25 марта 2020

Двойные кавычки не нуждаются в обратном слэсе sh в одинарных кавычках.

index($cell, '\"');

Напротив: он ищет обратную косую черту sh, за которой следуют двойные кавычки, которых нет в строке, поэтому возвращаемое значение равно -1.

say index 'Notebook 24"', '\"';  # -1
say index 'Notebook 24"', '"';   # 11
0 голосов
/ 26 марта 2020

Решение:

...

if($sheet->Range("B". $i)->{Value} =~ m/\"/)
{                   
   $sheet->Range("B". $i)->{Value} =~ s/"/ Inches/;                        
}

...
...