#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. да, спасибо! очень четкое объяснение! теперь я действительно понял. спасибо за скромность и терпение!