Как последовательно читать строку массива из входных данных

#arrays #perl

#массивы #perl

Вопрос:

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

sites.txt : (входной файл)

 site1
site2
site3
  

программа

 #!/usr/bin/perl


my $file = 'sites.txt';
open(my $fh, '<:encoding(UTF-8)', $file)
     or die "Couldn't open file !'$file' $!";

my @rows = <$fh>;
chomp @rows;
foreach my $site (@rows) {
    $sitename    = $site;
    @domains     = qw(.com .net .org);
    foreach $dns (@domains){
        $domain = $dns;
        print "$site$dnsn";
    }
}
  

и результат выглядит следующим образом

 site1.com
site1.net
site1.org
site2.com
site2.net
site2.org
site3.com
site3.net
site3.org
  

Я понимаю до этого момента, но я хочу сделать это первым элементом массива из @domains
сначала читаем до конца входной строки,
затем возвращаемся к 1-й строке ввода и переходим к следующему элементу массива, чтобы
вывод был бы таким,

 site1.com
site2.com
site3.com
site1.net
site2.net
site3.net
site1.org
site2.org
site3.org
  

возможно ли это? или нужен другой модуль.извините за основной вопрос
Я буду очень признателен за ответы.
спасибо 🙂

Комментарии:

1. Извините, я не знаю. я не вижу там никакой опции perl 🙂

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

3. Можете ли вы написать пример кода, я новичок в perl… Спасибо

4. @andrew99 Я только что опубликовал ответ. Должен ли я уточнить?

5. Я не понимаю ответа, сэр, да, было бы неплохо, если бы вы могли уточнить это дальше, потому что я новичок

Ответ №1:

Вы перебираете все свои сайты, а затем (для каждого сайта) добавляете домен к текущему сайту.

В псевдокоде это:

 foreach site
    foreach domain
       print site   domain
  

Поменяйте местами ваши циклы, чтобы логика была

 foreach domain
    foreach site
        print site   domain
  

Обратите внимание, что это псевдокод, а не Perl.


В «реальном» Perl это выглядело бы как:

 #!/usr/bin/env perl

use strict;
use warnings;

my $file = 'sites.txt';
open( my $fh, '<:encoding(UTF-8)', $file )
  or die "Couldn't open file !'$file' $!";

my @rows = <$fh>;
chomp @rows;

my @domains = qw(.com .net .org);

foreach my $dns (@domains) {
    foreach my $site (@rows) {
        print "$site$dnsn";
    }
}
  

Вывод

 site1.com
site2.com
site3.com
site1.net
site2.net
site3.net
site1.org
site2.org
site3.org
  

Пожалуйста, всегда включайте use strict; и use warnings; поверх ваших скриптов. Эти два оператора покажут вам наиболее распространенные ошибки в вашем коде.

Комментарии:

1. Спасибо, теперь это работает. можете ли вы объяснить мне часть с ошибкой. потому что я не понимаю, в чем разница с моим скриптом.

2. Всегда пожалуйста. Я почти отчаялся. Подумайте вот о чем: вам нужны 3 товара из 3 магазинов. Ваш код говорит «Зайдите в shop_1 и купите item_1, затем перейдите в shop_2 и купите item_1, затем перейдите в shop_3 и купите item_1. После этого сделайте то же самое для shop_2 и shop_3.» Мой код говорит «Зайдите в shop_1 и купите items_1, _2, _3. Затем перейдите к shop_2 и _3 и сделайте то же самое.». Результат тот же, это просто другой порядок.

3. да, спасибо! очень четкое объяснение! теперь я действительно понял. спасибо за скромность и терпение!