• ベストアンサー

Perl 行の置換

ご教示お願い致します。 ーーーーーーーーーーーテキストファイルーーーーーーーーーーー 5,a,a,a,a,a 4,a,a,a,a,a 3,a,a,a,a,a 2,a,a,a,a,a 1,a,a,a,a,a ↓ 5,a,a,a,a,a 4,a,a,a,a,a 3,a,a,a,a,a 2,ddddd,44444,sssss,ffffff,ssssss 1,a,a,a,a,a my $NO = $form->param('NO'); $NO = 2 の場合 この1列目が2のとこのを 修正訂正をしたいです。 どのようにするのでしょうか?

  • Perl
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

以下でどうでしょう。 #!/usr/bin/perl use strict; use warnings; my @d = <DATA>; for my $i (0 .. $#d) { if ($d[$i] =~ /^2/) { $d[$i] = "2,ddddd,44444,sssss,ffffff,ssssss\n"; last; } } print @d; __END__ 5,a,a,a,a,a 4,a,a,a,a,a 3,a,a,a,a,a 2,a,a,a,a,a 1,a,a,a,a,a

perlhogehoge
質問者

お礼

できました! ありがとうございます!

関連するQ&A

  • Perlについてご教示お願い致します。

    Perl初心者です。ご教示お願い致します;; ~text.txt~ 3,name,text 2,あ,あ 1,あ,あ 上記のようなテキストファイルがあり、 my $NAME = $form->param('name'); my $TEXT = $form->param('text'); unshift(@DATA,"$NO,$NAME,$TEXT\n"); と、略してますが、 NAMEとTEXTは、ページフォーム内のテキストを入力で CGI.pmを使用し、入力することはできました。 そこで、NOなのですが、次回入力する際、「4」と テキストファイルの1行目の1列目に+1した数字を 書き込むようにしたいのですが、 どのようにすればいいでしょうか? my $NO = $ここに1行目の1列目の数字 + 1; これを,unshiftの前に入れるまではわかるのですが、 「$ここに1行目の1列目の数字」 これがどう求めるのかわりません;;

    • ベストアンサー
    • Perl
  • Perl 変数 連番 for

    いつもお世話になっております。 for文?の使い方を教えてほしいです。 my $test1 = $form->param('test1'); my $test2 = $form->param('test2'); my $test3 = $form->param('test3'); my $test4 = $form->param('test4'); my $test5 = $form->param('test5'); このようにtestは同じでその後ろに連番がついている場合の変数なのですが これが何十個もあれば、記述するのも管理するのも、少し面倒です。 それでfor文を利用し、 for ($i= 1; $i < 31; $i++){ この中の記述 } ソースを短縮したいのですが、 「この中の記述」がわかりません・・・ ご教示お願い致します。

    • ベストアンサー
    • Perl
  • Perl BBS掲示板 サーバ側のファイル削除

    いつもお世話になっております。 サーバ側のファイルを削除したいのですが、 どのようにすればいいのでしょうか・・・? #-----------------------------------------DELETE sub deletedata { use CGI; my $form = new CGI; my $tm = time; my $DELETE = $form->param('pass'); my $NO = $form->param('no'); my $NAME = TransFormdata($form->param('name')); my $TITLE = TransFormdata($form->param('title')); my $TEXT = TransFormdata($form->param('text')); my $img = TransFormdata($form->param('img')); open(FILE, "<$FILE") or die("error :$!"); eval{ flock(FILE, 1) }; @DATA = <FILE>; close FILE; my $DELETE = $form->param('pass'); my $NO = $form->param('no'); if(length $NO == 0) {} elsif($DELETE eq $PASSWORD) { deleteImg($NO); splice @DATA, $NO, 1; } else{} open(FILE, ">$FILE") or die("error :$!"); eval{ flock(FILE, 2) }; print FILE @DATA; close FILE; &endform } #-----------------------------------------DELETE #-----------------------------------------UPFILEDELETE sub deleteImg { my ($NO,$tm,$NAME,$TITLE,$TEXT,$imgname) = split(/,/, $DATA[$_[0]]); $filename = $DIR . $imgname; if(-e $imgname) { unlink $filename; } } #-----------------------------------------UPFILEDELETE ラジオボタン選択 ↓ パスワード入力 ↓ 削除ボタン ↓ 削除 この段階で テキストファイルの指定行は削除されているのですが、 画像が投稿され、サーバー側に残っているファイルも削除させたいのです。 Unlinkを使うとなっていたのですが・・・わからないです。 どうかご教示お願い致しますm(;;)m

    • ベストアンサー
    • Perl
  • EXCELのデータ比較をして抽出

    EXCELで2つのシートを比較してSheet1にあってSheet2にないものをSheet3に出したいのですが、どうやったらいいですか? Sheet1は deta1 date2 date3 12222 kkkkk mmmmmm 13333 ddddd ssssss Sheet2は date1 date2 date3 12222 xxxxx vvvvvv 14444 yyyyy jjjjjj となっていてA列(date1)を比較して Sheet3に、 13333 ddddd ssssss を表示させたいと思っています。

  • Perl BBS 掲示板 改行処理

    改行処理について教えてください。 今まで書き込み処理で unshift @DATA, "$tm,$FORM{'name'},$FORM{'title'},$FORM{'text'}\n"; としていたのですが、これを use CGI; my $form = new CGI; my $NAME = $form->param('name'); my $TITLE = $form->param('title'); my $TEXT = $form->param('text'); unshift(@DATA,"$tm,$NAME,$TITLE,$TEXT\n"); に変更しました。 すると sub loadFormdata が聞かなくなり、 改行処理他が対応しなくなってしまいました、 この場合、 loadFormdataの部分のどこを変えればよいでしょうか? |------書き込み処理------| sub printdata{ use CGI; my $form = new CGI; &loadFormdata(); open(FILE, "<$FILE"); eval{ flock(FILE, 1) }; @DATA = <FILE>; close FILE; my $tm = time; my $NAME = $form->param('name'); my $TITLE = $form->param('title'); my $TEXT = $form->param('text'); unshift(@DATA,"$tm,$NAME,$TITLE,$TEXT\n"); while(@DATA > $MAX) { pop @DATA; } open(FILE, ">$FILE") or die("error :$!"); eval{ flock(FILE, 2) }; print FILE @DATA; close FILE; } |------改行処理他------| sub loadFormdata { my ($query, $pair); if($ENV{'REQUEST_METHOD'} eq 'POST') { read(STDIN, $query, $ENV{'CONTENT_LENGTH'}); } else { $query = $ENV{'QUERY_STRING'}; } foreach $pair (split(/&/, $query)) { my $key = ("$NAME,$TITLE,$TEXT"); my ($key, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg; $value =~ s/&/&amp;/g; $value =~ s/</&lt;/g; $value =~ s/>/&gt;/g; $value =~ s/\x0D\x0A\s*/<br>/g; $value =~ s/\s+/ /; $FORM{$key} = $value; } }

    • ベストアンサー
    • Perl
  • Perl 順位 複数のLoop

    合計の順位を求めたいのですが、 詰まってしまいました。 どうかご教示お願い致しますm(_ _)m まず下記のように Class1 1.txt の 3列目の合計 65.2 2.txt の 3列目の合計 80.5 3.txt の 3列目の合計 70 4.txt の 3列目の合計 92.6 5.txt の 3列目の合計 76.1 6.txt の 3列目の合計 85.2 このように6つのファイルがあり その3列目の合計は求めるとこまできました。 6つのファイルを元に順位をつけて HTMLのテーブル化を試みているのです。 for($Class=1;$Class<=5;$Class++){ open(F, "<","Class$Class.txt"); flock(F, 1); @CL = <F>; close F; for($KakuFile=1;$KakuFile<=$#CL;$KakuFile++;){ open(F, "<","KakuFile/$KakuFile.txt"); flock(F, 1); @DATA = <F>; close F; for($A=0;$A<=20;$A++;){ my $Data = $DATA[$A]; chomp($Data); my ($Name,$No,$Sum,...etc) = split(/,/, $Data); $SumDex = "Sumの合計を求める式"; #1.txt の場合 65.2 #2.txt の場合 80.5 #3.txt の場合 70 $RANK = "ここにどのような記述が入りますか?"; #1.txt の場合 6 #2.txt の場合 3 #3.txt の場合 5 #4.txt の場合 1 #5.txt の場合 4 #6.txt の場合 2 $HTML[$A] =" ~略 <td>$Name</td> <td>$SumDex</td> <td>$RANK</td> ~略 "; @HTML , $HTML[$A]; open(F, ">:utf8","RankHtml.txt") or die("error :$!"); flock(F, 2); print F "@HTML\n"; close F; } } } 最終的な結果としては、 <td>1.txtのName</td> <td>65.2</td> <td>6</td> <td>2.txtのName</td> <td>80.5</td> <td>3</td> <td>3.txtのName</td> <td>70</td> <td>5</td> <td>4.txtのName</td> <td>92.6</td> <td>1</td> <td>5.txtのName</td> <td>76.1</td> <td>4</td> <td>6.txtのName</td> <td>85.2</td> <td>2</td> このような結果がほしいです。 実際やりたいことはこのようなことなのですが、 どうすればいいのかわからず説明も、おかしなとこがあるかもしれません;; どうかお助け願いますm(_ _)m また、初心者で、Loopの使いかたがおかしかったり とかも指摘頂けると幸いです。

  • submitでのデータの受け渡しについて

    submitにてデータを受け渡すときについての質問となります。 変数を一つ受け渡す場合はこのようにすればいいと思うのですが、 print start_form; print submit('abc'); print hidden( -name => 'sample', -value => $a ); print end_form; 2つ以上の変数を受け渡す時には、どのようにすれば良いのでしょうか。 my $a = "red"; my $b = "black"; my @ab = ($a, $b); print start_form; print submit('color'); print hidden( -name => 'sample', -value => @ab ); print end_form; ####################################### my ($a, $b) = param('sample'); print $a; print $b; というふうにすると、print $a;はredを表示してくれますが、 $bにはblackは入っておらず表示してくれません。 どのようにすれば、配列を渡して、変数2つを受け取ることができるのでしょうか?? ご回答よろしくお願い致します。

    • ベストアンサー
    • Perl
  • 複数行あるExcelのある列の情報を統合したい

    以下のことを、Excel2010のVBAで実施したいのですが、どなたかご教示いただけないでしょうか。 これまで、VBAを自身で作成したことがなく、お手上げ状態につき、どうかよろしくお願いします。 実施したいことは、下記または添付画像のように、 「品名」(A列)、「品番」(B列)および他の列項目(###)のデータが完全一致の場合、ひとつの行に統合して、「エラー番号」(列D)のデータを列Dの中で、セミコロン区切りで結合させる、 です。 ・統合元となった行は、「エラー番号」の統合後に削除する。 ・「品名」AAAの「エラー番号」NO333のように統合後の「エラー番号」にダブリが残っても構いません。 ・件数の上限はありません(Excel2010の上限1048576まで対象行があると想定) ・他の項目(###)は複数あるのですが、「エラー番号」の列がD列という前提でお願いします。 【VB実行前】 列A 列B 列C 列D 品名 品番 ### エラー番号 AAA A123 ### NO111;NO333 BBB B123 ### CCC C123 ### NO111 AAA A123 ### NO222;NO333 CCC C123 ### NO555 AAA A12345 ### NO222 CCC C12345 ### NO111 AAA A123 ### NO999 【VB実行後】 列A 列B 列C 列D 品名 品番 ### エラー番号 AAA A123 ### NO111;NO333;NO222;NO333;NO999 BBB B123 ### CCC C123 ### NO111,NO555 AAA A12345 ### NO222 CCC C12345 ### NO111

  • perlでcheckboxがうまく整理できない

    perl5.8でFormから送られてきたデータを取得し、整理しています。 FormはPOSTでperlに送り、データを整理したのですが、checkboxで複数のデータを送ったとき、うまく処理されていません。 Formのあるページも同じperlでcgiページを作り、エラーがあった場合、エラーメッセージ付きで再度そのcgiページを表示するようにしています。 次の内容で、@noにcheckboxで選択した番号が入るようにしています。 valueには - が余分にありますが、これは試しにcheckboxで複数選択してデータをsubmitしてみたところ、受け取り先の$in{no}で番号が連続して1つのスカラーで連なるので、番号を後に分割するために-を入れ、受け取り後、@no = split(/-/, $in{no});でばらして@noに番号を格納してあります $r_noは別のデータから受け取った比較先の番号です Formのcheckboxの部分は(実際はこれを複数回ループして$r_noが変化します) my $checkbox; foreach my $l (@no){ my $i = 0; if($l == $r_no){ $i = 1; } if($l == $r_no){ $checkbox = "<input type=\"checkbox\" name=\"no\" value=\"$r_no-\" checked>"; last; }else{ $checkbox = "<input type=\"checkbox\" name=\"no\" value=\"$r_no-\">"; } } print "$checkbox"; 2つ以上checkboxを選択して、わざとエラーが出るように他の部分を間違った選択をするようにして試してみたところ、@noには選択した分だけの番号が格納されているにもかかわらず、 if($l == $r_no){ の部分が真になるのは1つ目の@noとの真偽だけで、2つ目以降は本来真になるべき比較でも偽になってしまいます。 改行コードなどが入っているのかと思い、chompで後ろを削ったり、$l =~ s/\r?\n/K/g; $l =~ s/\r/K/g;で改行コードを可視化して確認してみましたが、それらしきものも入っていませんでした @noには選択した番号全てが収納されていますし、後ろに改行コードなど不要なものも入ってないのに真偽の分岐がうまくいかない原因は何にあるのでしょうか? 思い当たるものは一通り試したのですが、どうしてもわかりません。 「これが原因かも?」みたいな可能性だけでも結構ですので教えてください。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • エクセル関数内の行番号を同じにしたい。

    A列にYesかNoを選ぶセルがあり、Yesの場合は、隣の列(B列)に "ここをクリック" という文字列を出し、別シートの同じ場所に飛び、そして、Noの場合は、隣の列(B列)に "OK"という文字列を出して終わり。ということがやりたいです。 1.B1に以下の関数を入力しました。 =IF(A1="Yes", HYPERLINK("#sheet2!A1","こちらをクリック"),IF(A1="No","OK"," ")) 2.これをコピーしてB2以下に反映しようと考えました。ですが、 リンク先の"#sheet2!A1"のA1の行番号が以下のように、増えてくれません。 =IF(A2="Yes", HYPERLINK("#sheet2!A1","こちらをクリック"),IF(A2="No","OK"," ")) 3.コピーするだけで、"#sheet2!A1"の部分のセルが1つ繰り上がるように(この場合、A1からA2に)するには、どのようにしたらいいのでしょうか? 4. 3.が出来ない場合、何か他の方法を教えて頂きたく。 5.当方、VBAの知識がないので、マクロを組みたくても組めないのが現状です。 以上よろしくお願いします。

専門家に質問してみよう