2013-04-02 5 views
0

я пытаюсь получить конкретные элементы из массива в Perl, но код не работаетPerl получить определенные элементы из массива

print "Enter the column numbers you want separated by comma "; 
$temp=<>; 

@shortdays = qw/Mon Tue Wed Thu Fri Sat Sun/; 
@weekdays = @shortdays[scalar $temp]; 

print @weekdays; 
+0

это печатает только первый элемент .. например, если я поставлю 3,4 .. он будет печатать только третий элемент – user2235827

+4

[Вы должны использовать строгую и предупреждения] (http://stackoverflow.com/questions/8023959/ why-use-strict-and-warnings) – TLP

+0

['scalar $ temp'] (http://p3rl.org/scalar) ** точно ** совпадает с' $ temp'. –

ответ

0

Это работает на моем месте:

my $temp=<>; 
my @shortdays = qw/Mon Tue Wed Thu Fri Sat Sun/; 
my @id=split ",",$temp; 
my @weekdays; 

for(@id) 
{ 
push(@weekdays,@shortdays[$_]); 
} 
print @weekdays; 
+0

Почему вы использовали цикл '' for' (http://perldoc.perl.org/perlsyn.html#For-Loops)? Просто используйте список slice '@weekdays = @shortdays [@id];' –

0

сделать это как это:

#!/usr/bin/perl -w 
use strict; 

print "Enter the column numbers you want separated by comma ";  
my $temp=<>; 
my @a1=split(/,/,$temp); 
my @shortdays = qw/Mon Tue Wed Thu Fri Sat Sun/; 
my @weekdays = @shortdays[@a1]; 
print "@weekdays"; 
+0

Нельзя указывать ['warnings'] (http://perldoc.perl.org/warnings.html), используя [' -w' ] (http://perldoc.perl.org/perlrun.html#*-w*) на линии shebang. –

+0

@BradGilbert: Брэд, любая конкретная причина, почему -w не является предпочтительным? – Guru

+1

Во-первых, он работает только в том случае, если файл указан в командной строке. Он никогда не работает для модулей, а не модулей Perl5 ('.pm') и Perl4 (' .pl'). Сценарий можно вызвать как «perl -e'use»; do ("script.pl") '', в этом случае [' ​​-w'] (http://perldoc.perl.org/perlrun.html#%2A-w%2A "perldoc perlrun") никогда не применяется. (конечно, в этом случае лучше было бы написать «perl -Mdiagnostics script.pl») –

2

Если вы хотите взять кусочек массива, вы должны поместить список чисел в скобках [ .. ], не строка. Одна строка - это, ее список будет рассматриваться как число и поэтому преобразован в число, но, как вы отметили, это будет только первое число.

Если ты use warnings включен, который я сильно подозреваю, что вы этого не сделаете, вы получите ошибку:

Argument "3,4\n" isn't numeric in array slice at yourscript.pl ... 

Но Perl делает преобразовать эту строку в число, как может, и придумывает 3.

Итак, вот что вы сделали неправильно. Что вы могли бы сделать вместо этого:

my @nums = $temp =~ /\d+/g; 
my @weekdays = @shortdays[@nums]; 

Что бы извлечь целые числа из строки достаточно простым способом. Это также устранит необходимость использования конкретного разделителя, такого как запятая. Обратите внимание, что скобки для скобок подразумеваются при использовании глобального модификатора /g.

Если вы настроены на использование запятых, используйте split для извлечения чисел. Но имейте в виду, что это может оставить пробелы и другие нежелательные символы.

my @nums = split /,/, $temp; 

При отладке, с помощью инструкции, такие как

print @weekdays; 

Это немного сбивает с толку. Я бы рекомендовал вам сделать это:

use Data::Dumper; 

... 

print Dumper \@weekdays; 

Тогда вы увидите, что именно содержит массив.

И, конечно же, добавьте эти две строки для всех ваших скриптов:

use strict; 
use warnings; 

Если вы использовали это, вы не были бы с этой проблемой. Информация и контроль и сокращение времени отладки, что эти две прагмы обеспечивают больше, чем компенсировать короткую кривую обучения, связанную с их использованием.

0

Один из способов добиться того, что вы хотите, используя свой подход будет

@weekdays = @shortdays[split(","$temp)]; 

И печать выглядит лучше так:

print join(' ',@weekdays), "\n"; 
0
use strict; 
use warnings; 

my @shortdays = qw'Mon Tue Wed Thu Fri Sat Sun'; 

print "Enter the column numbers you want\n"; 

my $line = <STDIN>; 
my @ids = $line =~ /[0-7]/g; 
my @days = @shortdays[ @ids ]; 

print join(', ', @days), "\n"; 

Так как вам нужно только $line и @ids раз , вы можете уйти, не используя их.

# my $line = <STDIN>; 
# my @ids = $line =~ /[0-7]/g; 
# my @days = @shortdays[ @ids ]; 
my @days = @shortdays[ <STDIN> =~ /[0-7]/g ]; 

Почему /[0-7]/g вы можете спросить.

  • действительными действительными являются 0..7.
  • Не нужно знать, что пользователь использует для разделения чисел.
  • /g предоставит нам список совпадений.

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

Смежные вопросы