2013-04-02 60 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/爲什麼使用嚴格和警告) – TLP

+0

['標量$ 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' loop](http://perldoc.perl.org/perlsyn.html#For-Loops)?只需使用列表切片'@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

您不應使用['-w'指定['warnings'](http://perldoc.perl.org/warnings.html) ](http://perldoc.perl.org/perlrun.html#*-w*)在shebang線上。 –

+0

@BradGilbert:Brad,爲什麼-w不是首選的具體原因? – Guru

+1

首先,它只有在文件是在命令行中指定的文件時纔有效。它從不適用於模塊,既不是Perl5('.pm')也不是Perl4('.pl')樣式模塊。可以像這樣調用腳本'perl -e'use diagnostics; 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會給我們一個匹配列表。

由於正則表達式只匹配一個數字,我們不需要指定用戶應該使用什麼來分隔數字。實際上(在這種情況下)用戶甚至根本不需要分開它們。