2010-08-03 2 views

ответ

4

Вы не указали ТОЧНО, что хотите, насколько логично, но лучше всего предположить, что вы хотите печатать символы между первым и последним пробелами.

В вашем примере кода будет напечатано слишком много символов, так как он печатает # символов перед последним пространством (в вашем примере 10 вместо 7). Чтобы исправить, вам нужно настроить количество символов, напечатанных путем вычитания # символов перед первым пространством.

Кроме того, вы должны начать один символ справа от «индекс» значение, чтобы избежать печати первого места - это «+1» и «-1» в примере ниже

$cat d:\scripts\test1.pl 
my $str = "abc def yyy ghi"; 

my $first_space_index = index ($str, ' '); 
my $substring = substr($str, $first_space_index + 1, 
          rindex($str, ' ') - $first_space_index - 1); 
print "|$substring|\n"; 


test1.pl 
|def yyy| 
1

откровенно , substr/index/rindex на самом деле не путь туда. Вы лучше делать что-то вроде:

my $str = "abc def yyy ghi"; 
my @row = split ' ', $str; 
pop @row and shift @row; 
print "@row"; 

Что является более неэффективным, но фиксирует фактическое намерение лучше

+0

хороший момент, хотя вы плавающим в направлении «и теперь у вас есть две проблемы» площадь :) – DVK

+0

@DVK нет, посмотреть, как я осторожно обошел регулярное выражение там – ivancho

+0

Мех ... просто формальности. .. ты был там по духу;) – DVK

3

Третий аргумент длины, не компенсируется. Но это может быть отрицательным, чтобы указать символы с конца строки, который легко получить из Rindex и длины, как так: (. Примечание добавление 1, чтобы получить смещение после первого пробела)

my $str = "abc def yyy ghi"; 
print substr($str, 1 + index($str, ' '), rindex($str, ' ') - length($str)); 

2

Если вы хотите напечатать текст между первым и последним пространством, не было бы проще с регулярным выражением?

print $1 if "abc def yyy ghi" =~/(.*)/
Смежные вопросы