perl

2010-07-14 12 views
13

में स्थानांतरित करें मैंने पेर्ल सीखना शुरू कर दिया है और नई चीजों को आजमाने की कोशिश की है।perl

मुझे टेक्स्ट प्रोसेसिंग में कुछ समस्या है। मैं फार्म के कुछ पाठ,

0 1 2 3 4 5 6 7 8 9 10 

6 7 3 6 9 3 1 5 2 4 6 

मैं इस पाठ स्थानांतरित करना चाहते हैं। जैसे, मैं पंक्तियों के रूप में कॉलम ans कॉलम के रूप में पंक्तियां बनाना चाहता हूं। आईडी में पेर्ल में ऐसा करने का कोई तरीका है?

सभी को धन्यवाद।

+0

संपादन के लिए धन्यवाद। :) मुझे बताएं कि उस ब्लॉक के अंदर महत्वपूर्ण डेटा कैसे रखा जाए। मैं अगली बार से इसका ख्याल रखूंगा :) – jerrygo

+0

प्रत्येक पंक्ति को 4 रिक्त स्थान से इंडेंट करें। –

+0

मुझे लगता है कि सही पर्ल तरीका एक सीपीएएन मॉड्यूल का उपयोग करना होगा, जैसे [डेटा :: पिवोट] (http://search.cpan.org/~bdulfer/Data-Pivot-0.05/Pivot.pm), लेकिन शायद यह है चुनौती नहीं आप के बाद ... – Mike

उत्तर

12

तो यह समाधान एक सरणी के सरणी का उपयोग करता है, प्रत्येक नेस्टेड सरणी डेटा की एक पंक्ति है। बहुत आसानी से आप प्रत्येक पंक्ति में कॉलम पर लूप करते हैं और उन्हें इंडेक्स का उपयोग करके इंडेक्स के रूप में मूल्य को धक्का देने के लिए अन्य सरणी-ऑफ-एरे पर धक्का देते हैं। आपके द्वारा अनुरोध किए गए डेटा को पिवोट करने का प्रभाव है।

#!/usr/bin/env perl 

my @rows =(); 
my @transposed =(); 

# This is each row in your table 
push(@rows, [qw(0 1 2 3 4 5 6 7 8 9 10)]); 
push(@rows, [qw(6 7 3 6 9 3 1 5 2 4 6)]); 

for my $row (@rows) { 
    for my $column (0 .. $#{$row}) { 
    push(@{$transposed[$column]}, $row->[$column]); 
    } 
} 

for my $new_row (@transposed) { 
    for my $new_col (@{$new_row}) { 
     print $new_col, " "; 
    } 
    print "\n"; 
} 

में यह परिणाम:

0 6 
1 7 
2 3 
3 6 
4 9 
5 3 
6 1 
7 5 
8 2 
9 4 
10 6 
+0

धन्यवाद। महान समाधान :) – jerrygo

+0

आपको प्रारंभ करने के लिए पुश की आवश्यकता नहीं है: '@rows = ([qw (0 1 2 3 4 5 6 7 8 9 10)], [qw (6 7 3 6 9 3 1 5 2 4 6) ]); ' – dolmen

+0

यह सच है, आपको इसकी आवश्यकता नहीं है। लेकिन पर्ल में बाकी सब कुछ की तरह इसे करने के एक से अधिक तरीके हैं। :) – dalton

3

निश्चित रूप से है, और माइक ने सबसे आसान तरीका बताया है। यदि आप सीख रहे हैं, तो शायद आप अपना खुद का काम लिखना चाहते हैं?
सबसे पहले, आप split को रिक्त स्थान पर प्रत्येक पंक्ति चाहते मूल्यों की एक सरणी प्राप्त करने के लिए (या push सरणी में list of wordsDalton's answer में के रूप में, पर्ल में, वहाँ हमेशा एक से अधिक तरीके कुछ भी करने को है)
फिर, for each element in the array, आप इसे और उसके समकक्ष को दूसरी पंक्ति में उसी पंक्ति पर प्रिंट करना चाहते हैं। (यदि आप एक सरणी दूसरे से पहले बाहर निकलते हैं तो आप क्या करेंगे?)

बेशक, यदि आप पर्ल सीखना चाहते हैं, तो आप निश्चित रूप से सीपीएएन का भी उपयोग करना सीखना चाहेंगे, इसलिए डेटा का उपयोग करने का प्रयास करना अभी भी उपयोगी है :: धुरी।

+0

आपके सुझावों के लिए धन्यवाद। मैं निश्चित रूप से उन कोशिश करूँगा। – jerrygo

5

यहाँ एक तरह से डेटा स्थानांतरित करने के लिए की एक रूपरेखा है। क्योंकि आप CPAN का उपयोग करने की आवश्यकता होगी इस उदाहरण के माध्यम से कार्य करना शिक्षाप्रद हो जाएगा, आप उपयोगी List::Util और List::MoreUtils मॉड्यूल बारे में सीखना होगा, आप जटिल डेटा संरचनाओं की मूल बातें सीखना होगा (देखें perlreftut, perldsc, और perllol), और आपसे संपर्क करेंगे पर्ल में एक इटरेटर का उपयोग करें।

use strict; 
use warnings; 
use List::MoreUtils qw(each_arrayref); 

my @raw_data = (
    '0 1 2 3 4 5 6 7 8 9 10', 
    '6 7 3 6 9 3 1 5 2 4 6', 
); 

my @rows = ... ; # Look up map() and split() to fill in the rest. 
       # You want an array of arrays. 

my @transposed; # You will build this in the loop below. 

my $iter = each_arrayref(@rows); # See List::MoreUtils documentation. 

while (my @tuple = $iter->()){ 
    # Do stuff here to build up @transposed, which 
    # will also be an array of arrays. 
} 
+0

धन्यवाद। उन सभी को आजमाएं :) – jerrygo

1
use strict; 
# read the first line 
my @labels = split ' ', <>; 
# read and ignore the empty second line 
<>; 
# read the third line 
my @values = split ' ', <>; 
# transpose (I suppose you'll do more with the table than just printing it) 
my %table = map { $labels[$_] => $values[$_] } 0..$#labels; 
# print 
foreach (@labels) { 
    print "$_ $table{$_}\n"; 
} 
2

यह मेरा नया टैब-सीमांकित फ़ाइल स्थानांतरित करने के लिए स्क्रिप्ट है। यदि आप चाहें तो अपने डेलीमीटर में \ t बदलें।

#!/usr/bin/perl -anF/\t|\n/ 
$n = @F - 1 if !$n; 
for $i (0..$n) { 
    push @{ $m->[$i] }, $F[$i]; 
} 
END { 
    for $r (@$m) { 
     print join("\t", @$r), "\n"; 
    } 
} 

या एक 104 चरित्र "एक लाइनर" (साथ apostrophe-बैकस्लैश-न्यू लाइन-apostrophe क्षैतिज स्क्रॉल बचने के लिए जोड़ा) के रूप में:

perl -anF'\t|\n' -e'[email protected]!$n;for(0..$n){[email protected]{$$m[$_]},$F[$_]}'\ 
'END{print map{join"\t",@$_,"\n"}@$m}' 
1
use List::UtilsBy qw/zip_by/; 

my @transposition = zip_by { [ @_ ] } @matrix; 

https://metacpan.org/pod/List::UtilsBy#zip_by

+0

स्टैक ओवरव्लो के लिए Weclome! क्या आप कृपया ** अपने उत्तर में कोड समझा सकते हैं ** और ** लिंक के प्रासंगिक हिस्सों को सारांशित करें **? – kdbanman

0
use strict; 
my ($i, $rows, $cols) = (0, 10, 100); 
# initiate array 10x100 
my $array = [map {[map {$i++} (1..$cols)]} (1..$rows)]; 
# transpose array into 100x10 array 
my $transpose = [map {[map {shift @$_} @$array]} @{$array->[0]}]; 

सरणी एक मैट्रिक्स होना चाहिए, यानी कॉलम प्रत्येक पंक्ति के लिए बराबर होना चाहिए, मूल सरणी

नष्ट हो जाएगा इस कोड को अतिरिक्त का उपयोग नहीं होगा ट्रांसफर के लिए स्मृति, अन्य पुस्तकालयों के लिए x2, उदाहरण के लिए 100x1M के लिए बड़ी सरणी के लिए, यह

महत्वपूर्ण है