/ / पर्ल - कॉलम का पहला अक्षर प्रिंट करें - पर्ल

पर्ल-प्रिंट कॉलम के पहले अक्षर-पर्ल

मैं इनपुट फ़ाइल के कॉलम 2 के पहले अक्षर के साथ-साथ ब्याज के अन्य कॉलम को भी प्रिंट करने की कोशिश कर रहा हूं। मुझे यकीन नहीं है कि निम्न स्क्रिप्ट क्यों, से अनुकूलित है। शब्द का पहला अक्षर मिलान मुझे "अनइंस्टाल्यूटेड वैल्यू $ कॉलम [2]" का उपयोग चेतावनी देता है।

इनपुट फ़ाइल उदाहरण:

ATOM      1  CAY GLY X   1      -0.124   0.401  -0.153  1.00  2.67      PEP
ATOM      2  HY1 GLY X   1      -0.648   0.043  -1.064  1.00  0.00      PEP
ATOM      3  HY2 GLY X   1      -0.208   1.509  -0.145  1.00  0.00      PEP

आउटपुट फ़ाइल उदाहरण:

   1  C  -0.124   0.401  -0.153  1.00  2.67
2  H  -0.648   0.043  -1.064  1.00  0.00
3  H  -0.208   1.509  -0.145  1.00  0.00

लिपि

open (my $input_fh, "<", $filename) or die $!;
while (my $data = <$input_fh>) {
chomp $data;
my @columns = split(/t/, $data);
my ($firstletter) = ($columns[2] =~ m/^d+(w)/);
if (/CAY/../HT2/)
print $output_fh join ("t", $columns[1], $firstletter, $columns[6], $columns[7], $columns[8]), "n";
}

अद्यतन करें के कारण चेतावनी हुई if (/CAY/../HT2/) किसी कारण के लिए बयान - लेकिन चूंकि इनपुट फाइलें समान हैं, मुझे वास्तव में इस स्थिति की आवश्यकता नहीं है। इसके अलावा, चूंकि स्तंभ 2 में कोई अंक नहीं हैं, इसलिए इसका उपयोग करना अधिक उपयुक्त है। /^(w)/ regex।

उत्तर:

उत्तर № 1 के लिए 1

क्या कोई विशेष कारण है जो आपको होना चाहिएटैब पर विभाजित एक मनमाना पाठ फ़ाइल में विभिन्न प्रकार के सफेद स्थान को सही ढंग से प्राप्त करना उपयुक्त हो सकता है। यदि आवश्यक नहीं है, तो यह (किसी भी) स्थान से विभाजित करने के लिए पूरी तरह से उपयुक्त लगता है, फिर पहले अक्षर को पकड़ो

my @cols = split "s+", $data;
my ($firstletter) = $cols[1] =~ m/^(w)/;

मुझे यकीन नहीं है कि बाकी क्या करते हैं, लेकिन आप आसानी से उन कॉलमों को आसानी से लगा सकते हैं जिनकी आपको आवश्यकता है।


उत्तर № 2 के लिए 1

विभाजित करने के बाद आपको जो मिलता है उसे डिबग करने का प्रयास करें:

my @columns = split(/t/, $data);
local $" = "n"; print "$datanSplitted into:n@columns";

जैसा कि आपकी फ़ाइल में डबल टी अक्षर हैं। मेरा मतलब है कि आपके पास शायद: ATOMtt1 CAY GLY X... इसलिए दूसरा कॉलम है undef


जवाब के लिए 0 № 3

यह मुझे उस कोड की तरह लगता है जिसने यह चेतावनी दी थी कि आप जो दिखा रहे हैं वह वैसा नहीं था, बल्कि कुछ ऐसा था

($columns[2]) = ($columns[2] =~ m/^d+(w)/);

और आपको चेतावनी मिल रही है क्योंकि एक अंक नहीं मिलने के कारण रेगेक्स विफल हो रहा है। शायद आपका मतलब था d*?


उत्तर के लिए -3 № 4

मेरे लिए, शायद मैं कट कमांड और पाइपलाइन का उपयोग करना चाहता हूं, फिर सटीक जानकारी प्राप्त करने के लिए विभाजन को विभाजित करें।