2013-10-23 26 views
1

我需要從一行中獲取基於數字的字段,其中字段用空格分隔。現在的問題是,這些字段本身可能包含空格,但它們將在單引號中。需要基於用戶從一個變量而不是數組指定的位置獲取單個字段值

即:

$var="1 'abc def' 234 '' '456' 77 'ghi jkl mno p ' 99 ' q ' 88 ' r'"; 

如何抓abc def,當用戶在位置1希望元素?

+0

棘手。我可能會檢查最好的信是否是一個單引號。然後我會'分裂(/'/,$ var);'並且根據第一個字母是一個引號,無論是偶數還是奇數索引都是引用的元素,而其他的必須在空格處進一步分割。並重新插入原來的位置... – DeVadder

+0

哦,只是有一個更好的主意。如何先在空間分割,然後遍歷元素,檢查它們是否包含單引號,將這些元素與下一個元素合併,直到到達另一個帶引號的元素?如果Input沒有像''或'abc'這樣的字段,那麼可以工作,儘管這些情況當然可以單獨處理。 – DeVadder

+0

字符串不一致 l – user2702225

回答

5

檢查Text::ParseWords核心模塊,

use Text::ParseWords; 
my $var = "1 'abc def' 234 '' '456' 77 'ghi jkl mno p ' 99 ' q ' 88 ' r'"; 
my @words = quotewords('\s+', 0, $var); 

# use Data::Dumper; print Dumper \@words; 
my $position = 1; 
print $words[$position]; # 'abc def' 
+1

Text :: ParseWords看起來非常好! –

+0

這是一個很好的模塊,今天真的學到了有用的東西。 – DeVadder

+0

Text :: ParseWords其實真的很好。感謝您的幫助。即使我今天學到了新東西 – user2702225

1

我的(未經測試)的方法是

use Data::Dumper; 

my $var="1 'abc def' 234 '' '456' 77 'ghi jkl mno p ' 99 ' q ' 88 ' r'"; 

my @data = split("\s",$var); 
my @result; 

foreach my $substr (@data) { 
    s/[\"|\']//g; 
    push(@result,$_) unless $_ eq ""; 
} 

print Dumper @data; 

將返回這樣

@data = [ 
    "1", 
    "abc def", 
    "234", 
    ... 
]; 

的東西,現在你可以訪問每一個通過簡單對象

$data[index]; 
相關問題