- 締切済み
perlスクリプト
perlの勉強をしているものです。人様の作ったスクリプトを解析しています。以下のスクリプトについて質問があります。 while(chomp($in = <STDIN>)){ last if ($in eq "\cD"); print "$in"; } このスクリプトに出てきている、"\cD"の意味と、ifの前に出てきているlastの働きが分かりません。またこのスクリプトは全体としてどのような仕事をするのでしょうか?? 分かる方いらっしゃいましたら、ご教授いただけると幸いです。よろしくお願いします。
- fortunefeeling
- お礼率60% (21/35)
- Perl
- 回答数1
- ありがとう数1
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- SE-1
- ベストアンサー率57% (26/45)
¥cD は Control-D のエスケープのようです。なぜそれがそこに入っているのかはスクリプトのほかの部分を見ないとわかりませんが。それから last は while ループを抜けだすために記述されています。 ですので、標準入力から入ってきた各行について、最後の改行を除いて、のこりの文字列が¥cD ならwhile ループを抜け、そうでなければその行を表示してループを繰り返す、というのが示された部分の意図するところだと思います。
関連するQ&A
- perlのdo-while文で抜け出せない
perlのwhile,do-while,last文に関する質問です。 1) code1のようなプログラムを作ったのですが eでdo_whileを抜け出すことができませんがなぜでしょうか。 ---code1(eで抜け出せない)(NG)--- my $sum=0; do{ my $a=<STDIN>; chomp($a); $sum=$sum+$a; }while($a ne 'e'); print $sum; -------------------------------- 2) 抜け出す方法をいろいろ試していたら while(1)にしてlastで抜けるようにすると code2ではeで抜け出すことができるように なりましたが、 do~while(1)にしたcode3では、 「Can't "last" outside a loop block at …」C というエラーが発生します。 code2とcode3はwhileがdo~whileになって 条件を見る位置がループの始めか終わりの 違いだけなのに、なぜ、code2ではOKで、 code3ではエラーになるのでしょうか。 ---code2(eで抜け出せる)(OK)----- my $sum=0; while(1) { my $a=<STDIN>; chomp($a); last if ($a eq 'e'); $sum=$sum+$a; }; print $sum; --------------------------------- ---code3(エラーになる)(NG)----- my $sum=0; do{ my $a=<STDIN>; chomp($a); last if ($a eq 'e'); $sum=$sum+$a; }while(1); print $sum; --------------------------------- よろしくお願いします。 Windows7 , ActivePerl(v5.16.3)
- ベストアンサー
- Perl
- Perlのワンライナーをスクリプトにしたい
初歩的な質問で恐縮ですが、以下のPerlのワンライナーを、スクリプトファイルに記述するには、どのように書けば良いのでしょうか。 perl -ne "print if ( /aaa/ ); print if ( /bbb/ ); print if ( /ccc/ );" "in.txt" > "out.txt" 下記のようにしてみたのですが、ダメでした。 perl "script.pl" "in.txt" > "out.txt" ----- script.plの内容 ----- print if ( /aaa/ ); print if ( /bbb/ ); print if ( /ccc/ ); --------------------------- 環境はWindowsのコマンドプロンプトです。バッチファイルでの使用を想定しています。 自分はPerlに関する知識が無いので、Perlに関するサイトも見てみたのですが、情報が膨大で、ピンポイントでこの問題を解決する情報を探し出す事が出来ませんでした。 やり方が分かる方がおられましたら、お教え頂けないでしょうか。
- ベストアンサー
- Perl
- bashのスクリプト内で、パイプ入力を受け取るには?
bashのスクリプトで質問です。 hoge_command 何らかのコマンド bashtest.sh bashスクリプト とあるときに、 hoge_command | bashtest.sh のようにパイプでの入力をスクリプト内で受け取る方法はありますか? たとえばperlであれば、 while(<STDIN>){ .... のようにして受け取ることができると思いますが、 bashでは、どのようにすればよいでしょう。 また、bashtest.sh で、引数無しのときにUsageを出すようにしてあった場合にうまく動作しないので、 hoge_command | bashtest.sh - のように記述して受け取る方法はあるでしょうか? (同じくperlなら、 if( $ARGV[0] eq "-" ){ while(<STDIN>){ .... のように書いて逃げるところと思います。 初歩的なことで恐縮ですが、よろしくお願いします。
- ベストアンサー
- その他(プログラミング・開発)
- [Perl] Pack関数について教えてください。
こんにちは。 下記は、pack関数のサンプルスクリプトですが、 なんでそのような結果になるのか、よくわかりません。どなたか教えていただけますか。 print "文字列を入力してください:"; $string = <STDIN>; chomp ($string); $length = length($string); print "数値を入力してください:"; $number = <STDIN>; chomp ($number); # Do Pack! $packed = pack("A${length}i", $string, $number); print "パック文字列: $packed\n"; --- 結果 --- 文字列を入力してください:perl 数値を入力してください:100 パック文字列: perl
- ベストアンサー
- Perl
- perlスクリプト $1 qq などについて。
以下のスクリプトについて質問があります。 $_ = $mail; m/(^[a-zA-Z0-9\.\_\-]+\@[a-zA-Z0-9\.\_\-]+)/g; $mail = $1; if($in{mail} ne $mail){ &PrintError('メールアドレスは、半角文字で書いてください。'); } このスクリプトなのですが、$mailの値を$_に代入し、$_の値をm/・・・ の部分で半角チェックしているのは分かるのですが、半角チェックされた後どうなっているのかがわかりません。また、$1 とはどうゆう意味なのでしょうか??ifより後の部分は分かっています。 また、 open(IN, "<database.dat"); while (<IN>) { print; } close(IN); の全体的な説明をお願いしたいです。ファイルハンドルという概念とopen,close両関数は分かっています。 最後に print qq(Content-type: text/html; charset=Shift_JIS\n\n); とあった場合の qq の意味が分かりません。 分かる方いらっしゃいましたらご教授くださると幸いです。よろしくお願いします。
- ベストアンサー
- Perl
- STDINがうまく動きません。
次のようなスクリプトを書いて、Windows上でDOSプロンプトから scr.pl < aho.txt と実行しましたが何も出力されません。 エラーメッセージなども表示されません。 STDINのpipeが動いていないと思われるのですが、何か書き方に 問題があるのでしょうか? 教えてください。 よろしくお願いします。 #!/usr/bin/perl-w while (<STDIN>) { chomp; print $_; }
- ベストアンサー
- Perl
- perl 下記スクリプトは正常に動きますか?
今まで長い間、何か勘違いしていたのか、条件が2つ以上になると、 長い間このように書いていたのですが、 if( ($a%2==1 && $b==1) && ($c eq 10 && $d == 5) ) { print "ok"; } 下記スクリプトでも正常に動作しますか? if( $a%2==1 && $b==1 && $c eq 10 && $d == 5){ print "ok"; }
- ベストアンサー
- Perl
- スクリプトの繰り返しの防止
下記のようなスクリプトがあります。 これは、CSVファイルを1行表示し、編集可能にするスクリプトの1行表示部分です。 これを全行表示するスクリプトに変更したいと考えています。 while ($cnt) { foreach(@csv2){ .............................. } } とすると無限ループするようです。(サーバーが固まる) webで調べたのですが、$cnt = '1'or die "$!"としても抜けだせません。 行が無くなったら作業を終了するとしたいのですが、どうすればいいでしょうか? 初歩的な質問で恐縮なのですが、レンタルサーバーをこれ以上固まらせるわけ にもいかないため、ご教授頂ければと思います。 @csv2 = split(/\<>/,$csv[$param{'num'}]); $cnt = '1'; foreach(@csv2){ &trString(\$_, "1",); if($_ eq $csv2[-1]){ chomp($_); } print "<tr>\n"; print qq|<td><input type="text" name="$cnt" size="30" value="$_"></td>|; print "</tr>\n"; $cnt++; }
- ベストアンサー
- Perl
- FASTAファイルをperlでフォーマット
>(DNA配列の描写 i.e.生物名、リファレンス番号) AGCAAAAGGGGGGGCCCCCCCCCCCCCCC 以下数行DNA配列が続く。 という繰り返しでできているFASTAファイルを 一列目を >(DNA描写) 二列目を一本のDNA配列 で表示させたい、と思っています。 while (<STDIN>){ if(/^>/){ print; }else{ chomp; chop; } }; print; としたのですが うまくいきません。 なぜなのでしょうか。
- 締切済み
- Perl
- マッチ演算子に変数をはさんではいけませんか?
本を読んでPerlを自習しています。ptなるテキストファイルから、ある名前を含む行だけを標準出力に打ち出すプログラムを作ろうと、 print "who?"; $who = <STDIN>; open IN, "pt"; while (<IN>){ if(/$who/){ print; } } close IN; というスクリプト(のつもり)を書いたのですが、動きません。本の中の例文の切り貼りで作ったのですが、どこが問題なのでしょうか。スクリプトをそのまま提示して質問するのは反則かと思うのですが、どこが問題かがわからないもので。是非教えてください(動くと自分にとってはすごく便利なんです)。
- ベストアンサー
- Perl
お礼
回答ありがとうございました!参考になりました。