• 締切済み

「perl -ne 'print if 15 .. 17' ファイル名」 の「 if 15 .. 17」

perl -ne 'print if 15 .. 17' ファイル名 は、ファイルの15行目から17行目までを出力すると http://www.geocities.co.jp/SiliconValley-Sunnyvale/6128/perl/oneline.html に書いてありました。 コマンドラインオプション -ne の意味も分かるし、print が print $_ の省略だということも分かるのですが、if 15 .. 17 の if の機能が分かりません。 if の後に数字を書くと、どういう働きがあるのでしょうか?

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

みんなの回答

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

15と17の間にある連続したピリオドがポイントです。 この演算子は、 for my $i in (1..10) { のように書くと、1から10までという範囲を表すものになりますが、 if (15..17) { のようにした場合、 In scalar context, ".." returns a boolean value. The operator is bistable, like a flip-flop, and emulates the line-range (comma) operator of sed, awk, and various editors. Each ".." operator maintains its own boolean state. It is false as long as its left operand is false. Once the left operand is true, the range operator stays true until the right operand is true, *AFTER* which the range operator becomes false again. It doesn't become false till the next time the range operator is evaluated. It can test the right operand and become false on the same evaluation it became true (as in awk), but it still returns true once. If you don't want it to test the right operand till the next evaluation, as in sed, just use three dots ("...") instead of two. In all other regards, "..." behaves just like ".." does. The right operand is not evaluated while the operator is in the "false" state, and the left operand is not evaluated while the operator is in the "true" state. The precedence is a little lower than || and &&. The value returned is either the empty string for false, or a sequence number (beginning with 1) for true. The sequence number is reset for each range encountered. The final sequence number in a range has the string "E0" appended to it, which doesn't affect its numeric value, but gives you something to search for if you want to exclude the endpoint. You can exclude the beginning point by waiting for the sequence number to be greater than 1. If either operand of scalar ".." is a constant expression, that operand is considered true if it is equal ("==") to the current input line number (the $. variable). ということになります。 #すみませんが日本語訳は自分で探してください #perlop.pod とかで探せば見つかるかも で結局どういうことかというと、 $. が 15から17の間だけこのifの条件は真になります。 $. は入力行の行数ですから、結果的に15行目から17行までを 出力するということになります。 と。日本語訳ありました perlop - Perl の演算子と優先順位 http://perldoc.jp/docs/perl/5.8.8/perlop.pod の、 Range Operators operator, range range .. ... という見出しからちょっと下がった辺りです。

white-tiger
質問者

お礼

ありがとうございます!

関連するQ&A

  • 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 -e "print 'A';"

    perl -e "print 'A';" とコマンドラインで実行すると、Aが表示されますが、 PHP5でこれと同様のことはできますか? ファイルから実行させたくありません。

    • ベストアンサー
    • PHP
  • 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
  • 二つのファイルを1行ずつ出力するperlプログラム

    perl初心者です。 二つのテキストファイルを1行ずつ交互に出力するプログラムを作成しています。 コマンドラインからファイル名を渡して、 (二つのファイル名がそれぞれファイルa、ファイルbとした時) 1:ファイルa 1行目 2:ファイルb 1行目 3:ファイルa 2行目 4:ファイルb 2行目 となるようにしたいです。 while <STDIN> などを使うのでしょうか? 自分の知識ではプログラミングしきれそうにないのでどのようにしたらいいのか回答お願い致します。

  • perl の printでのファイルへの指示にて

    独学でmacでパールを勉強しています。 始めてからまだ1週間くらい。 教科書みながら、print命令でファイルハンドルに指示を出してるのですが、 書き込めはできるのですが、 ファイルが無い場合、 新規に自動でファイルが作成されるはずとの記載があったのですが、 何故か、自動でファイルが生成されません。 調べても、設定が必要等言われてますが、 mac自体も初心者でほとんどわかりません。 どのような設定にすればいいのでしょうか? また、ソースに何か悪い所があるのでしょうか? お助けください。   ちなみに下記がソースです。 ーーーーーーーーーーーーーーーーーーーーーーーーーーーー #!/usr/bin/perl print "Content-type: text/html\n\n"; print "<HTML>\n"; print "<HEAD><TITLE>アクセスカウンタ</TITLE></HEAD>\n"; print " <BODY>\n"; print "<H1>test</H1><HR>\n"; if ( open ( FH , "count.txt")){ $cnt = <FH>; close( FH ); $cnt++; print"<CENTER>あなたは${cnt}人目の訪問者です。</CENTER>\n"; if ( open(FH, ">count.txt" )){ print FH $cnt; close(FH); } else { print "ファイルの書き込みオープンに失敗しました。\n"; } } else { print "ファイルの書き込みオープンに失敗しました。\n"; } print "</BODY>\n"; print "</HTML>\n"; __END__ ーーーーーーーーーーーーーーーーーーーーーーーーーー

    • ベストアンサー
    • Perl
  • 特定文字列で囲まれた範囲を抜き書きするためには?

    特定の文字列で開始され、特定の文字列で終了するテキストの一部を抜き出すためには、コマンドラインからは perl -ne 'print if /開始文字列/ .. /終了文字列/' file.txt でできると思うのですが、これがたとえば $page 変数に入ったテキストで同様の処理を Perl 内部のスクリプトで行う時にはどうすればいいのでしょうか? while(<$page>){ ... } とかやって1行1行処理してみようと思ったのだけど、できません。

    • ベストアンサー
    • Perl
  • Perlのプログラミングについて

    Perlのプログラミングでつまづきました。 # ファイルから指定文字列を含む行を収集する # 入力ファイルのオープンと読み込み print( "入力ファイル名?" ); $n = <STDIN>; chomp( $n ); open( FIN, "<$n" ) or die "入力ファイルオープンエラー: $!\n"; $n = @a = <FIN>; close( FIN ); print( "$n 行読み込みました\n" ); # 行の収集 print( "検索文字列?" ); $x = <STDIN>; chomp( $x ); $ptn = $x; #指定の文字列 $x = @b = grep( /$ptn/, @a ); print( "$x 行見つかりました\n" ); # 出力ファイルのオープンと書き出し print( "出力ファイル名?" ); $y = <STDIN>; chomp( $y ); open( FOUT, ">$y" ) or die "出力ファイルオープンエラー: $!\n"; print FOUT ( $ptn, "\n" ); print FOUT ( $x, "\n" ); print FOUT ( @b ); close( FOUT ); というプログラムで実行すると C:\My Perl\pl>perl プログラムの実行.pl 入力ファイル名?sample1.txt 168 行読み込みました 検索文字列?k 45 行見つかりました 出力ファイル名?out3-24.txt 続行するには何かキーを押してください . . . となり出力ファイルの中身が表示されません。 どこを間違えているのかご指摘いただけないでしょうか?

  • Perlを使った単語出現カウント

    コマンドライン引数で 入力ファイルからデータ受け取って結果を出力ファイルに書き込みたいのですが、プログラムは #!/usr/bin/perl while ( <> ) { @words = split(" "); $wc{@words[0]} += 1; } foreach $key (keys %wc) { print "$wc{$key} $key\n"; } で今のコードでは、コンソールに出力されるだけとなってしまいます。 ファイル入出力を行うにはどうすればいいですか?

    • ベストアンサー
    • Perl
  • WindowsでPerlをする際,1行目の"#! ~"はどのように?

    Perlの参考書・本等ではプログラムファイルの第1行目は #! /usr/local/bin/perl という1行がよく有りますが,WindowsXPを用いている場合では,この1行をどう直せばよいのでしょうか? #! (perl.exeが存在するフォルダのパス) でよいのでしょうか? 私はWindowsXPを使っていて,この1行を使わずにプログラムを書いておりましたので,この1行の意味がよく分かりません。 ある参考書には,"#!はその行に書いたコマンドに,ファイルの残りの部分を渡して実行すると言う性質を持っている"と有りました。だから,試しにfile1.plとfile2.txtを準備し, file1.plの中身  #! (perlの存在するフォルダのパス)\perl.exe  while(<STDIN>){   print;  } file2.txtの中身  hello world として,コマンドプロンプトで file1.pl < file2.txt としたのですが正しく動作しませんでした.(perl file1.pl < file2.txt と入力した場合は正しく"hello world"となりました)

    • ベストアンサー
    • Perl
  • perl が 実行できない

    perl 初心者です。 apache を起動させ(起動画面は表示)、perl のファイルを IE で表示させようとして、print文を実行しても、print文がそのまま表示されるだけになっています。 perl のパスは、#! d:/perl/bin/perl です。 (コマンドラインから実行すると実行できるので、インストールは正常です。) (XP以前だったと思いますが、そのときは IEで、長文のプログラムが起動できていましたが。)