コマンド上の行間とは何か?

このQ&Aのポイント
  • コマンド上の行間について説明します。
  • Windows7でCygwinコマンドを使用している際に、行間が異なる理由について解説します。
  • また、行間の設定についても考えてみましょう。
回答を見る
  • ベストアンサー

コマンド上の行間

Windows7でCygwinコマンドを使用しています。 コマンドに次の2通りを入力しました。 1. $ head -2 data.csv 1000,-60 2000,-30    ・    ・ 2. $ perl test.pl <data.csv 1000,-60 2000,-30    ・    ・ test.plは次のように書きました。 for($line =0;$_ =<stdin>;$line++){ if($line < 5){ print"$_\n"; } } 1つ目、2つ目ともにdata.csvのデータをコマンド上に出力していますが、どうして行間があったりなかったりしているのですか。 また、行間設定とかできるのですか。

  • cstag
  • お礼率77% (14/18)
  • Perl
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

ダイヤモンド演算子 <> は「改行」まで一緒に取り込みます。 $_ =<stdin> で、$_に改行まで含めた1行が取り込まれています。 対策方法は次のいずれかです。(両方やったら今度は改行がなくなります) ・chomp関数などで末尾の改行を削除する。 ・出力時によけいな改行を付けない。 今回程度ならどちらでもいいです。 過去の質問からして、このあと @data=split(/,/) ; 等として利用するのではないか、と予想されます。 この場合、改行を取り除いておかないと、@dataの最後の要素が改行付きのものになります。 例: 10,11 → splitしたら $data[0]='10'; $data[1]='11\n'; になります。 <>の使い方は、Perlの基礎です。 もうちょっと基礎を勉強した方がよくないですか?

cstag
質問者

お礼

丁寧なご説明ありがとうございます。 基本が全然分かっていませんでした。

その他の回答 (1)

回答No.1

>print"$_\n"; ↓ print"$_"; ではないですか?

cstag
質問者

お礼

回答ありがとうございます。 print"$_";に訂正すると行間がなくなりました。

関連するQ&A

  • CSVファイルの処理方法

    PerlでCSVファイルの処理をしようとしています。 CSVファイル(ここではdata1.csvとします)の中身は、A列とB列に数値が1000行程表記されています。 -5,1 -4,2 -3,3  ・  ・  ・ 作成したPerlのファイル(ここではtest1.plとします)下のようにし、 while ($_=<stdin>){ print"$_\n"; } Cygwinコマンド上で、 $ perl test1.pl <data1.csv と入力すると、CSVファイル(data1.csv)の数値がCygwinコマンド上に全て表記されます。 前置きが長かったのですが、CSVファイル(data1.csv)の3行目までの数値だけをCygwinコマンド上に表記したい場合、どのようにプログラムすればよいのですか。 お願いします。

    • ベストアンサー
    • Perl
  • 繰り返し処理の使い方

    繰り返し処理の使い方について質問です。以下の.plファイルを作成しました。 for($line =0;$_ =<stdin>;$line++){ if($line < 400){ @line = split/,/,; $data1 +=$line[1]; } } for($line =0;$_ =<stdin>;$line++){ if($line < 800){ @line = split/,/,; $data2 +=$line[1]; } } $data_1 = $data1; $data_2= $data2; print"$data_1 \n"; print"$data_2 \n"; この.plファイルで合計計算の実行を試みたのですが、data_2の値が0でした。(data_1は合計計算が出来ています。) 繰り返し処理の2つ目はなぜ0なのでしょうか、またdata_2の合計計算を実行するにはどうすれば良いのでしょうか。 お願いします。

    • ベストアンサー
    • Perl
  • <Perl>参照配列の出力に失敗する。

    <Perl>参照配列の出力に失敗する。 お世話になります。 配列の出力部で以下のエラーが出力されます。 Use of uninitialized value in print at test2.pl line 12. -----コーディングは以下の通りです。----- #!C:\perl use strict; use warnings; my @l = (); #----------- #GetDataへCSVファイル名と、格納用配列を渡す #----------- my $cnt = &GetData("test.csv", \@l); print "COUNT -> ".$cnt; for(my $i=0; $i < $cnt; $i++){ print $l[$i]; } ################################################################## # 概   要:指定したCSVファイルをオープンしCSVデータを配列に取得する。 # パラメータ:ファイル名, CSVデータ格納用配列 # 戻 り 値:データ取得件数 ################################################################## sub GetData { my ($f, @bf) = @_; my $rcnt = 0; print "FILE NAME -> ".$f."\n"; if ( open(FP, "<${f}") ){ print "FILE OPEN -> success.\n"; @bf = split(/,/, <FP>); close(FP); $rcnt = @bf; print "CSV GET COUNT -> ".$rcnt."\n"; } return $rcnt; } -----実行結果は以下の通りです。----- D:\>perl test.pl FILE NAME -> test.csv FILE OPEN -> success. CSV GET COUNT -> 5 Use of uninitialized value in print at test2.pl line 12. Use of uninitialized value in print at test2.pl line 12. Use of uninitialized value in print at test2.pl line 12. Use of uninitialized value in print at test2.pl line 12. COUNT -> 5 -----CSVファイルの内容は以下の通りです。(ファイル名:test.csv)----- あいうえお,かきくけこ,さしすせそ,たちつてと,なにぬねの 配列の要素数が取れているので、配列内にデータは格納されているとは思っています。 出力方法をどのように正せばよいがご教示お願い致します。

    • ベストアンサー
    • Perl
  • <STDIN>とARGVとの振る舞いの違いが分からず困っております。

    <STDIN>とARGVとの振る舞いの違いが分からず困っております。 Perlといいますか、プログラム初心者です。 現在、Perlでファイル処理を行おうと思っており、下記のようなスクリプトを書き、file_test.plとして保存・実行しようとしたのですが、実行時の命令の仕方により処理が出来たり出来なかったりで、困っております。どなたか、ご教授頂けませんでしょうか。 なお、使用環境はWindows XP, Active Perl 5.8.8です。 スクリプトのソース、読み込みファイル共にShift-JISです。 (ここには記載しておりませんが、処理後の吐き出しファイルはUTF-8になります) -------------------- file_test.plのソースファイル -------------------- use strict; use warnings; use encoding "cp932"; use Encode::Guess qw/euc-jp shiftjis 7bit-jis/; binmode STDIN, ':encoding(cp932)'; binmode STDOUT, ':encoding(cp932)'; binmode STDERR, ':encoding(cp932)'; my $csvname; if(defined($ARGV[0])){ $csvname = $ARGV[0]; print "csvname = $csvname\n"; #文字コード判定 my $enc = guess_encoding($csvname); ref($enc) or die "Can't guess: $enc"; print "encoding is ", $enc->name, "\n"; #UTF-8フラグチェック print utf8::is_utf8("$csvname") ? "UTF-8 Flag\n" : "not UTF-8 Flag\n"; } else{ print "input file: "; $csvname = <STDIN>; chomp($csvname); print "csvname = $csvname\n"; #文字コード判定 my $enc = guess_encoding($csvname); ref($enc) or die "Can't guess: $enc"; print "encoding is ", $enc->name, "\n"; #UTF-8フラグチェック print utf8::is_utf8("$csvname") ? "UTF-8 Flag\n" : "not UTF-8 Flag\n"; } open CSV, '<:encoding(sjis)', $csvname or die "$!"; print "FILE OPEN OK\n"; close(CSV); ------------------- file_test.plのソースファイル END ------------------- このソースを"perl file_test.pl csvfile.csv" で実行すると問題なく処理できます。 しかし、"perl file_test.pl" で実行し、あとからファイル名を入力すると、 "Invalid argument at file_test.pl line 35, <STDIN> line 1."というエラーが出ます。 (35行目はOPENコマンドの行です) しかし、 "perl -CA file_test.pl"と-CAオプションを入れ、後からファイル名を入力した場合、動作します(上述のファイルの実行と同時にファイル名を指定したものでも動きます)。 実際にはコマンドプロンプトからの実行ではなく、plファイルをダブルクリック、その後ファイル名を指定して処理を行いたいため、悩んでおります。 どのようにしたら、うまく実行できるか、ご教授頂ければ幸いです。

  • 番号をつける

    度々の質問で申し訳ないのですが、 ファイルに書き込むときに通し番号を付けたいのですがどうしたら良いか分かりません。 ファイルの行数を数えるのが良いのでしょうか? 良い方法がありましたら、教えてください。 #!c:/perl/bin/perl print "Content-type: text/html\n\n"; require 'cgi-lib.pl'; &ReadParse(\%data); $name = $data{'name'}; $age = $data{'age'}; $sei = $data{'sei'}; $input = $name.$age.$sei; $x=0; open(RF,"<member.dat"); while($line=<RF>){ if((index ($line,$input))>=0){ print "既に登録されています。<BR>"; $x++; } } close(RF); if($x==0){ open(FP,">>member.dat"); <---順番に番号をつけて、保存したい---> print FP $input; print FP "\n"; close(FP); print "<HTML><HEAD>\n"; print "<TITLE>登録完了</TITLE>\n"; print "</HEAD><BODY>\n"; print "<H3>登録完了しました。</H3>"; print "</BODY></HTML>\n"; } exit;

    • ベストアンサー
    • Perl
  • ファイルから検索

    ファイルを読み取って、検索し、結果を表示するプログラムを考えましたが、検索結果が全てのデータとなってしまいます。どう改善すれば良いのでしょうか? ファイル(mem.dat) あいこ29女性 唯21女性 裕樹23男性 <perlプログラム> #!c:/perl/bin/perl print "Content-type: text/html;\n\n"; require 'cgi-lib.pl'; &ReadParse(\%data); $kw=$input{'key'}; $n=0; #ファイル open (RF ,"mem.dat"); while($line=<RF>){ if((index $line,$kw)!=-1){ $n++; @data[$n]=$line; } } close(RF); print "<HTML><HEAD>\n"; print "<TITLE>検索結果ページ</TITLE>\n"; print "</HEAD><BODY>\n"; print "検索結果:$n件<BR>"; for($i=1;$i<=$n;$i++){ print "@data[$i]<BR>"; } print "</BODY></HTML>\n"; exit; 実行すると↓ 検索結果:3件 あいこ29女性 唯21女性 裕樹23男性

    • ベストアンサー
    • Perl
  • perlでcsvファイルから複数行を抽出したい

    プログラミング初心者です。 お知恵をお貸しください。 perlでcsvファイルから任意の複数行を、コマンドライン引数を使って抜き出したいです。 1行だけだとうまくいきますが、以下ではすべてのcsvデータが出力されてしまいます。 ----------------------getcsv.pl ここから---------------------- #!/usr/bin/perl -- use strict; use warnings; open(IN, "<adata.csv"); open (OUT, ">$bdata.csv"); while(<IN>){ if($. == $ARGV[0] || $ARGV[1] || $ARGV[2] || $ARGV[3]) { print OUT $_; } } close(IN); close (OUT); ----------------------getcsv.pl ここまで---------------------- ----------------------コマンド ここから---------------------- perl getcsv.pl 1 3 8 10 ----------------------コマンド ここまで---------------------- よろしくお願いします。

    • ベストアンサー
    • Perl
  • ファイルへの追加書き込みについて

    こんにちは。Perlを勉強しはじめた者です。 test1.plファイルにtuika.plを起動することで追加書き込みをしようとしているのですが、 その書き込みをプログラムの途中に行おうとしています。 内容としては、test1.plが文字置換を行うもので、その候補をtuika.plで入れてやります。 tuika.pl #!/usr/local/bin/perl use strict; use vars qw($oldword $newword); print "置換元の単語は? \n"; $oldword = <STDIN>; print "置換後の単語は? \n"; $newword = <STDIN>; open (FH, ">>test1.pl") or die "error $!\n"; seek FH, -47, 2; print FH "s/$oldword/$newword/og;\n"; close FH; seek関数は実際には途中書き込みには対応していない(?)ようなので、書き込みが末尾にきてしまい、うまくいきません…。 初心者な質問で申し訳ありませんが、なにか解決策がございましたら、ご教授願います。

  • Perlでのファイル内データ処理方法について

    プログラミングを始めたばかりです。 Cygwin上でPerlを行っています。 下に示すように、計算プログラムの中にデータを記入し、そのデータを処理することは出来たのですが、外部のファイルを読みそのデータを処理する方法が分かりません。 # y = ax + bを求める @x=(1,2,3); @y=(1,4,9); for($i=0;$i<$n;$i++){ $A = $A + ($y[$i] * $y[$i]); $B = $B + ($x[$i] * $x[$i]);   ・   ・   ・ $a=・・・ $b=・・・ print("a=$a,b=$b"); パールファイル(.pl)内に @x=(1,2,3); @y=(1,4,9); のように記載すると、データが変わるたびにファイル内の数値を入れ替えないといけないと思うのですが、cygwinのウィンドウに、 $ ./lesson.pl 10 <data1.csv のように入力しEnterすると、ファイル内の数値を入れ替えないで指定したファイル(ここではdata1.csv)のデータが処理されると思うのですが、その場合パールファイルをどのように記述すればよいのでしょうか。また、cygwinのウィンドウにどのように入力すればよいのでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • ファイルに書き込む

    二重に登録されないように既存ファイルを検索した後、ファイルに追記するプログラムを考えています。 次のプログラムを実行すると、二重登録されてしまいます。どうすれば、二重登録を防ぐ事ができるのでしょうか? #!c:/perl/bin/perl print "Content-type: text/html;\n\n"; require 'cgi-lib.pl'; &ReadParse(\%data); $name = $data{'name'}; $age = $data{'age'}; $sei = $data{'sei'}; $input = $name.$age.$sei; print "<HTML><HEAD>\n"; print "<TITLE>登録完了</TITLE>\n"; print "</HEAD><BODY>\n"; open(RF,"<mem.dat"); while($line=<RF>){ if($line eq $input){ print "既に登録されています。\n"; } } close(RF); open(FP,">>mem.dat"); print FP $input; print FP "\n"; close(FP); print "<H3>登録完了しました。</H3>"; print "</BODY></HTML>\n"; exit; 実行すると、二重登録されていても、必ず「登録完了しました。」と表示されてしまいます。

    • ベストアンサー
    • Perl