Что не так с этой заменой Perl? - PullRequest
1 голос
/ 07 сентября 2010

Используя приведенный ниже код, я хочу удалить .log в конце.Кажется, я все делаю правильно в соответствии с perlrequick .Где я все испортил?

test.pl

my $file = "ooout.log";
print $file."\n";
my $file =~ s/\.log//g;
print $file."\n";

вывод

$ perl test.pl
ooout.log

$

Ответы [ 6 ]

12 голосов
/ 07 сентября 2010

Вы переделываете my $file - удалите префикс my, чтобы это исправить. Это будет замечено, если вы запустите свой скрипт с

use strict;
use warnings;

Вы бы видели:

"my" variable $file masks earlier declaration in same scope at
8 голосов
/ 07 сентября 2010

Другие отметили вашу проблему с my.

Хочу отметить, что ваш код замещения не совсем соответствует вашей спецификации. Он удалит все вхождения строки .log из вашего имени файла.

Если вы хотите удалить только .log в конце вашей строки, не используйте модификатор g и используйте привязку конца строки $:

use strict;
use warnings;

my $file = "ooout.logical.log";
print "$file\n";
$file =~ s/\.log$//;
print "$file\n";

__END__

ooout.logical.log
ooout.logical
3 голосов
/ 07 сентября 2010

Попробуйте удалить my из строки замены:

$file =~ s/\.log//g;

Похоже, вы реинициализируете $file.

0 голосов
/ 07 сентября 2010

Второй my.

0 голосов
/ 07 сентября 2010

Вы говорите «my $ file» в третьей строке, поэтому вы определяете другую переменную.

Попробуйте:

my $file = "ooout.log";
print $file."\n";
$file =~ s/\.log//g;
print $file."\n";
0 голосов
/ 07 сентября 2010

Удалите второе my, тогда оно будет работать.

my (несколько упрощенно) объявляет new переменную.Вы объявляете $file дважды, поэтому второй my заставляет perl забыть значение в первом.

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