• 締切済み

Perl openの戻り値

いつもお世話になっております。 下記件でご教授頂けないでしょうか [Perlにおいてopen(INS,$common)の時の戻り値で後続を処理しない方法] (dieではない) [ソース] my $command = "grep -c ,'abc' acount.log |"; open (INS, $command) || die "command error $command \n "; 上記の場合 grepの結果が 0件の場合 row number 0 is out of range 0..-1 とメッセージが出ます。 どうにか回避したいのですが、 回避案あれば教えて下さい。

  • prr4e
  • お礼率48% (66/136)
  • Perl
  • 回答数2
  • ありがとう数1

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

どうして「後ろにパイプをつけると戻り値を取得できると思った」のか理解できません (そのようなことがどこかに書かれていましたか?) が「コマンドを実行したときの戻り値」なら system. あと, #1 で書きましたがそのようなメッセージがここで出ることはありません. 「本当は他のところで出ているが, たまたまここで目にしている」んじゃないかと思います.

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

まず, 「grep の結果がどうであるか」は open では判定できません. そして, そのメッセージは「この質問に書かれているところ」では出ません. よって, この質問に書かれた内容だけでは「回避案」を出すことは不可能です.

prr4e
質問者

補足

ご回答ありがとうございます。 後ろにパイプをつけると戻り値を取得できると思ったのですが、 openではできないんですね。 そのコマンドの上下でデバックしたのですが、 ちょうどその部分ででてたので、そこだと判断したのですが。

関連するQ&A

  • FTPコマンドの戻り値について

    UnixのシェルでFTPを行っていますが、 接続不可の時にエラーの戻り値を取りたいと考えています。 ただ、 OPEN XXX user aaa acount bbb get ファイル名 取得先/ファイル名 bye というシェルを実行した場合、接続先XXXが有り得ない場合、 戻り値($?)が0以外かと思っていたのですが、表示させると0になっていました。 接続できません、というメッセージは表示されるのですが。。。 戻り値でエラーを判断する方法をご存知の方、よろしく お願いします。

  • ファイル操作について

    別スレ立てているので、ルール違反になっちゃいますかね? もしそうであればゴメンナサイ… sub fanc{ my @array = @_; my $ag = shift @array; my $n1 = 'AAA.csv'; my $n2 = 'BBB.csv'; my $n3 = 'CCC.csv'; my $n4 = 'DDD.csv'; my $n5 = 'EEE.csv'; ・ opendir(DIR, "C:/Program Files/Apache Group/Apache2/cgi-bin/test");my @pairs = readdir(DIR); close(DIR); if($ag == 1){@files = grep(/$n1/,@pairs); } if($ag == 2){@files = grep(/$n2/,@pairs); } if($ag == 3){@files = grep(/$n3/,@pairs); } if($ag == 4){@files = grep(/$n4/,@pairs); } if($ag == 5){@files = grep(/$n5/,@pairs); } if($ag == 6){@files = grep(/$n6/,@pairs); } ・ $dfile1 = $files[0]; open(IN,"$dfile1") or exit; chomp(my $row01 = <IN>); chomp(my $row02 = <IN>); chomp(my $row03 = <IN>); chomp(my $row04 = <IN>); chomp(my $row05 = <IN>); chomp(my $row06 = <IN>); ・ close(IN); my @col01 = split(/,/, $row01); my @col02 = split(/,/, $row02); my @col03 = split(/,/, $row03); ・ ・ こういったコードをもっと短く、書くやり方を知りたいです。 grepでヒットするのが複数の場合もあるため、当初はForeach文とフOpenで配列@filesに入った ファイルを全て展開して、配列、又は変数に格納しようと思ったのですが、どうやって複数の配列をOpen関数で扱えばいいのか解りません。 もしそうでなければ、現在は一つのファイルに対しての処理ですが、残ったファイルに関しても関数を回す方法があれば、ご教授願えませんか??あ、あと、CODE(xxxxxx)ってなんのことでしょう?

    • ベストアンサー
    • Perl
  • Perlの戻り値について

    配列の戻り値が理解できていないのですが、 Perlで正しく動作させるためには どのように記述したら良いのでしょうか? 戻り値の動作を詳しく書いてある(出来れば図入りで) 本はありますか? 例) sub a { my @a = ('A'); return (@a, "B", 2); } my (@a, $b, $c) = &a; print "a=[@a] b=[$b] c=[$c]\n"; # a=[A] b=[B] c=[2] # これを期待していたが # a=[A B 2] b=[] c=[] # こちらになる

    • ベストアンサー
    • Perl
  • perlでCSVをソートする方法について

    perl初心者です。いつもありがとうございます。 perlでcsvファイル(1行のカラム数は200)、総行数は約3万行のファイルを37番目のカラム(-25以上25未満の数値データ)で降順ソートしその値によって行数がだいたい均等になるよう3分割し、2番目のカラムに文字でも数字でもよいのですがその4つのグループごとにフラグ(例えば1,2,3)を入れたいと思ってます。グループ化については境目の37番カラムの値は重複している場合が多いと思うのですがその場合は下(別に上でもかまいません)に入れるものとします。 ソートロジックは過去の質問を参照して理解しましたがグループ化しフラグを入れるルーチンがうまく作れません。下記のように作ったのですがこの先同じことを何度もやらなくてはならないので先に進めません。どなたかお助けください。最終的にやりたいことはカラム37でグループ化→カラム2にフラグを立てる、次にカラム2とカラム38(-25から0までの数値)でソートし同様に同じ行数になるようにグループ化→カラム3にフラグを立てる、さらにカラム2とカラム3とカラム39(-25以上25未満の数値データ)でソートし・・・同様に繰り返し最終的に1グループが100件(行)~150件(行)になるようにしたいのです。つまり約3万件のデータを3*4*2*4*2=192分割(5列の値で分類)したい、そしてどのような範囲で分割したかという情報も得たいのです。 use strict; use warnings; use utf8; use Encode; binmode STDOUT, ':encoding(utf-8)'; my $dir = './data'; # 処理するディレクトリ my $motoFile = 'customer.txt'; # もとファイル open my $fh, '<:encoding(cp932)', "$dir/$motoFile" or die 'ファイルが開けません。',"$!"; my %sorted; while (my $line = <$fh>) { my $key = (split /,/, $line)[37]; push @{$sorted{$key}}, $line; if (@{$sorted{$key}} == 1000) { open OUT, '>>:encoding(cp932)', "$dir/$key.tmp" or die "Can't open: $!"; print OUT @{$sorted{$key}}; close OUT; @{$sorted{$key}} = (); } } open OUT, '>:encoding(cp932)', "$dir/out.txt" or die "Can't open: $!"; foreach my $key (sort { $b <=> $a } keys %sorted) { if (-e "$key.tmp") { open IN, '<:encoding(cp932)', "$dir/$key.tmp" or die "Can't open: $!"; print OUT while <IN>; close IN; } print OUT @{$sorted{$key}} if @{$sorted{$key}}; } close OUT; #↓↓↓↓ここからフラグを作成するルーチン # 行数を調べ3つに分けるルーチン my @colum37; open IN, '<:encoding(cp932)', "$dir/out.txt" or die 'ファイルが開けません。',"$!"; my @in = <IN>; close IN; my $gyousuu = scalar(@in); my $amari = $gyousuu % 3; if ($amari == 0) { my $groupGyousuu = ($gyousuu-$amari)/3; print "総行数は$gyousuu","で、1グループの行数は$groupGyousuu","ほど、余りは$amari\n"; # あまりが0の時、group1は@inの0行 ~$groupGyousuu-1行まで #         group2は@inの$groupGyousuu行 ~$groupGyousuu*2-1行まで #         group3は@inの$groupGyousuu*2行~$groupGyousuu*3-1行まで foreach my $num (1..2) { push @colum37, (split /,/, $in[$groupGyousuu*$num])[37]; # これは境目の先頭の37番目 } print "@colum37\n"; #これでここまでは完成、分けるべき値がこの配列に入っている。 open OUT, '>:encoding(cp932)', "$dir/out.txt" or die "Can't open: $!"; foreach my $line (@in) { my @line = split /,/,$line; if ($line[37]>=$colum37[0]) { $line[1] = 1; }elsif ($line[37]>=$colum37[1] and $line[37]<$colum37[0]) { $line[1] = 2; }elsif ($line[37]<$colum37[1]) { $line[1] = 3; } $line = join (',',@line); print OUT $line; } close OUT; } elsif ($amari == 1) { この後未作成

    • ベストアンサー
    • Perl
  • マクロでコンボボックスのリストの設定について

    マクロを記述しているワークブック内では UserForm.ComboBox1.RowSource = "D2:D" & Range("D65536").End(xlUp).Row とすると希望通りのリストがコンボボックスに入るのですが、 他のワークブックからの参照ができないので教えてください。 C:\Documents and Settings\taro\デスクトップ にあるワークブック(abc.xls)のsheet1のD列をコンボボックスに入れるにはどのように書けばいいですか? 最初に WorkBoooks.open = (ThisWorkbook.path & "\abc.xls") などを記入する必要がありますか? できればワークブックを開けることなく値を参照したいです。 よろしくお願いします。

  • 【VBA】 通し番号の入力について

    こんばんは。 こちらの識者の方々にはいつもお世話になっています。 VBAの件で質問があります。 B列の最終行までA列に001から文字列で連番を振りたい場合、どのような構文になりますでしょうか。 Range("A1:A" & Range("B" & Cells.Rows.Count).End(xlUp).Row).Value = Format(row, "000") は通らなかったのですが、なにかいい構文はありますでしょうか。 データは必ず1000行以下ですので、番号は3桁で大丈夫です。 よろしくお願いいたしますm(_ _)m

  • 空欄もある別シート(複数)からの指定列コピー

    シート1、シート2のB5~D列最終行までをシート3のB5~E列に連続して貼り付けたいのですが、他の回答にあった下記の方法で試したところ、B5~E列最終行にデータがない場合、B4~E4のタイトル行が貼り付けられてしまいました。 lngR = SH1.Range("B65536").End(xlUp).Row SH1.Range("B5:D" & lngR).Copy Destination:=SH3.Range("B5") lngR = SH2.Range("B65536").End(xlUp).Row SH2.Range("B5:D" & lngR).Copy _ Destination:=SH8.Range("B65536").End(xlUp).Offset(1) 回避するにはどのようにしたらよいでしょうか? あるいは他に簡単な方法はありますか? ※このブックには関連しないシート4が存在します。

  • バッチファイル エクセル起動

    いつも大変御世話になっております。 WindowsVISTA環境で以下バッチ【ABC.bat】が稼動します。 "ABC.bat"------------------------------------------------- "C:\Program Files\Microsoft Office\Office12\EXCEL.EXE" "F:\EXCEL_OPEN\ABC.xls" echo %ERRORLEVEL% pause "ABC.bat"------------------------------------------------- 上記バッチの構文について3点質問があります。 (1)OS等が変わった場合、EXCEL.EXEの格納パスも変更するので   当然変更しなければいけないのでしょうか? (2)上記バッチを起動する前に他のエクセルを開いていた場合(例えばDEF.xls)、  ABC.xlsとDEF.xlsを両方閉じなければバッチの後続処理が動きません。  ABC.xlsだけ閉じてバッチの後続処理を動かす事は可能なのでしょうか? (3)上記構文でエクセル(マクロ)からエラーレベルを取得できるのでしょうか?  ※上記バッチで開くエクセルは開いたら自動でマクロが動きます。 もしご存知の方がいらっしゃるようでしたら、ご教授願いますでしょうか? 以上、何卒宜しくお願い致します。

  • workbookオブジェクトのクリアについて

    下記のコードはtest.xlsxを開き、ABCにセットして、開いたtest.xlsxを閉じた後、 ABCを参照しようとするコードです。 しかし、(4)でオートメーションエラーが発生します。 (3)のtest.xlsxを閉じるコードを 削除した場合うまくいきます。 開いたtest.xlsxを閉じた場合はABCにセットしたtest.xlsxもクリアされてしまうものなのでしょうか? 私のオブジェクトの認識では、エクセルファイルをオブジェクトにセットした場合はセット元のエクセルファイルは閉じてもworkbookオブジェクトのABCに保持されていると思っています。 ※test.xlsxを閉じたい理由は以降のコードで同名ファイルを開きたいからです。 よろしくお願い致します。 Sub a() Dim ABC As Workbook Workbooks.Open (ThisWorkbook.Path & "\" & "test.xlsx") '(1) Set ABC = Workbooks("test.xlsx") '(2) Workbooks("test.xlsx").Close savechanges:=False '(3) ThisWorkbook.Worksheets("Sheet1").Range("A1").Value = ABC.Worksheets("Sheet1").Range("A1").Value '(4) End Sub

  • Perl中で teeを使っても戻り値を得たい

    例えば make compile |& tee log とすると、tee のせいでmake の戻り値が得られないということに関しての相談です。 いま、perlの中で、 > $cmd = "$make compile 2>&1| tee compile.log"; > $rval = system($cmd); > if($rval){ print "Error\n"} のような使い方をしています(実際は$rval >>8 とする必要があるようです)。 上記のようにログを端末に表示し、ファイルにも落とし、かつ戻り値も利用したい、という場合、どのようにしたらよいのでしょうか。 # BASHでは echo ${PIPESTATUS[0]} で得られる、 # Perl のTee Moduleがあるなどの情報だけは発見できたのですが。。。 宜しくお願い致します。

専門家に質問してみよう