Perl выводит последовательную строку из массива - PullRequest
2 голосов
/ 17 апреля 2019

У меня есть массив, который я могу распечатать как «abcd», однако я пытаюсь распечатать его как «a> ab> abc> abcd». Я не могу понять, какой вложенный цикл мне нужен в цикле foreach, который у меня есть. Какой цикл мне нужен для его печати?

my $str = "a>b>c>d";
my @words = split />/, $str;

foreach my $i (0 .. $#words) {
print $words[$i], "\n";
}

Спасибо.

Ответы [ 4 ]

4 голосов
/ 18 апреля 2019

У вас была правильная идея, но вместо того, чтобы печатать слово в позиции i, вы хотите напечатать все слова между позициями 0 и i (включительно).Кроме того, ваш ввод может содержать несколько строк, поэтому зацикливайте их.

use warnings;

while (my $str = <>) {              # read lines from stdin or named files
  chomp($str);                      # remove any trailing line separator

  my @words = split />/, $str;      # break string into array of words
  foreach my $i (0 .. $#words) {
    print join '', @words[0 .. $i]; # build the term from the first n words
    print '>' if $i < $#words;      # print separator between terms (but not at end)
  }

  print "\n";
}

Есть много других способов написать это, но, надеюсь, этот способ поможет вам понять, что происходит и почему.Удачи!

3 голосов
/ 17 апреля 2019

один вкладыш:

perl -e '@a=qw(a b c d); for(@a) {$s.=($h.=$_).">"} $s=substr($s,0,-1);print $s'
1 голос
/ 18 апреля 2019

Я бы сделал это так:

#!/usr/bin/perl

use strict;
use warnings;

my $str = "a>b>c>d>e>f>g";
my @words = split />/, $str;

$" = '';
my @new_words;

push @new_words, "@words[0 .. $_]" for 0 .. $#words;

print join '>', @new_words;

Несколько вещей, чтобы объяснить.

Perl расширит переменные массива в строке в двойных кавычках. Вот как то так:

@array = ('x', 'y', 'z');
print "@array";

напечатает x y z. Обратите внимание, что между элементами есть пробелы. Строка, вставленная между элементами, контролируется переменной $". Поэтому, установив эту переменную в пустую строку, мы можем удалить пробелы, так:

$" = '';
@array = ('x', 'y', 'z');
print "@array";

напечатает xyz.

Самая сложная строка:

push @new_words, "@words[0 .. $_]" for 0 .. $#words;

Это просто компактный способ написать:

for (0 .. $#words) {
  my $new_word = "@words[0 .. $_]";
  push @new_words, $new_word;
}

Мы перебираем целые числа от нуля до последнего индекса в @words. Каждый раз в цикле мы используем фрагмент массива, чтобы получить список элементов из массива, преобразовать его в строку (поместив его в двойные кавычки), а затем вставить эту строку в @new_words.

1 голос
/ 17 апреля 2019

Это то, чем я закончил. Это единственный способ понять и получить результат, который я искал.

use strict;
use warnings;

my $str = "a>b>c>d>e>f>g";
my @words = split />/, $str;

my $j = $#words;
my $i = 0;
my @newtax; 
while($i <= $#words){
        foreach my $i (0 .. $#words - $j){
            push (@new, $words[$i]);
    }

    if($i < $#words){
        push(@new, ">");
    }
    $j--;
    $i++;
}

print @new;

Этот вывод "a> ab> abc> abcd> abcde> abcdef> abcdefg"

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