ここから質問投稿すると、最大10000ポイント当たる!!!! >>

test.pl -a -b opt file.txt
のようにオプション付きの引数とそうではない場合の引数を準備したいのですが、どの様にしたら良いのでしょうか?

イメージ
use Getopt:Std;
getopts('ab:);
if($opt_a){...}
if($opt_b){...}
open(IN, "$ARGV[0]") || die "error";
...

上手くいかなかったです↑↑↑

A 回答 (4件)

>でもこれを使わずに出来るほうが引数指定が分かり易いのでその方法を探しているのですがそれは不可能なのでしょうか?


質問者の環境で実行した時、現在のオプションやファイルの指定の仕方で問題が生じるということなので、そのままでは、方法はないかと思います。
オプションの指定自体はうまくいくということなので、
-file file.txt
などのようにオプションでファイル名を渡すようにするというのも1つの方法かと思いますが
「引数指定が分かり易い」は、多分に主観的なモノで、「--」は、古くからあるPerlの記法なので、Perlを使っている人にとっては特別わかりにくくはありません。(というより、わかりやすい)
    • good
    • 0

>オプションがあるとARGVにfile.txtが入らないのです。


ウチでは特に問題なかったですが、
もしオプションがある時にARGVがおかしくなるようだったら

test.pl -a -b opt -- file.txt

とすると良いです。
--でオプションの終わりを指示できます。

この回答への補足

有難うございます。-- を使う方法は参考になりました。でもこれを使わずに出来るほうが引数指定が分かり易いのでその方法を探しているのですがそれは不可能なのでしょうか?

補足日時:2005/04/20 11:49
    • good
    • 0

use Getopt:Std;→use Getopt::Std;


'ab:→'ab:'
だと思われます。
質問文の場合、
$opt_aに"1"が、
$opt_bに"opt"が入ります。

この回答への補足

タイプすみませんでした。
optは問題ないのですが、オプションがあるとARGVにfile.txtが入らないのです。
引き続き宜しくお願いします。・

補足日時:2005/04/15 02:20
    • good
    • 0

どう「上手くいかなかった」んですか?

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Q数値かどうかの判定方法

$aに代入されているものが数値かどうかを判定するにはどのようにしたらよいのでしょうか?

Aベストアンサー

$a =~ /^[0-9]*$/
上記の場合、*は「直前のパターンの0回以上の繰り返し」の意味なので、0から9がなくても、つまり$aが空でもマッチしてしまいます。
なので、
$a =~ /^[0-9]+$/
としましょう。
(+は「直前のパターンの1回以上の繰り返し」)
また、0-9は\dで表すこともできるので
$a =~ /^\d+$/
と書くこともできます。

Q複数ファイルの読み込みについて

perl初心者です。

あるディレクトリから拡張子がdataであるファイルを全て読み込みたいのですが、方法がわかりません。
cshで書くと
foreach arg (*.data)
コマンド $arg

のようになりますが、perlだと
foreach $arg (@arg){
コマンド $arg

となりますよね?
引数がリストなのでよくわかりません。
そもそもperlではできないのでしょうか?


それともう一点ですが、ファイルオープンするときに
foreachループの中で
open(FILE, "$arg");
とすることは可能ですか?
上の質問と組み合わせて全てのファイルを開いて作業を行いたいので。

説明が下手ですいません。補足しますのでよろしくお願いします。

Aベストアンサー

while(<*.data>)
{
## $_には、*.DATAなファイル名が格納されている。
open(F,"$_"); ##openする。
while(<F>)
{
##読み出された内容が$_に格納されている。
print $_; ##出力してみる。
}
}

というのが最短コーディングです。

QPerlで特定行から特定行までを抜き出したい

皆さんのお知恵をお貸し頂ければ幸いです。

Perlで以下のようなことをしたいと考えています。
例えば、次のようなテキストファイルがあったとします。

example.log
==================================
aaaa
hogehoge
test
okok
perl
script
==================================

上記ファイルを読み込んで、「hogehoge」から「perl」の間に挟まれた行だけ抜き出したいのです。
イメージとしては、読み込んだファイルを配列に入れて、一行づつ読ませ、キーワード「hogehoge」が現れたらそこでフラグを立て、それ以降の行を表示し、キーワード「perl」が現れた時点で表示を止めるという処理になるのかな?と思っています。

このような場合、どういう風にすればいいのでしょうか?
恐れ入りますが、ご教授頂ければ幸いです。

それでは、どうぞよろしくお願い致します。

Aベストアンサー

> 一行づつ読ませ、キーワード「hogehoge」が現れたらそこでフラグを立て、それ以降の行を表示し、キーワード「perl」が現れた時点で表示を止めるという処理になるのかな?と思っています。

それでいいと思いますよ?これをそのままコード化すると、こんな感じでしょうか。(No.1さんのとはちょっと結果が違います。)

open FH, "example.log" or die $!;
$flag = 0;
while ($data = <FH>) {
  chomp $data;
  if  ($data eq "hogehoge") { $flag = 1 }
  elsif ($data eq "perl")    { $flag = 0 }
  elsif ($flag) { print "$data\n" }
}
close FH;

で、もっと略したいPerlな人だとこんな感じ。Perl独特の記法がふんだんに使われているので、勉強するには不向きかもしれませんが^^;

open FH, "example.log" or die $!;
while (<FH>) {
  print if /^hogehoge$/ .. /^perl$/ and !/^(?:hogehoge|perl)$/;
}
close FH;

※インデントに全角空白を使っているので、コピーする場合はタブなどに置換して下さい。

> 一行づつ読ませ、キーワード「hogehoge」が現れたらそこでフラグを立て、それ以降の行を表示し、キーワード「perl」が現れた時点で表示を止めるという処理になるのかな?と思っています。

それでいいと思いますよ?これをそのままコード化すると、こんな感じでしょうか。(No.1さんのとはちょっと結果が違います。)

open FH, "example.log" or die $!;
$flag = 0;
while ($data = <FH>) {
  chomp $data;
  if  ($data eq "hogehoge") { $flag = 1 }
  elsif ($data eq "perl")    { $fl...続きを読む

QPerlで別ファイルから文字列の抽出

当方、サーバ管理でインフラ系の経験しかなく、今回はperlでスクリプトの作成に挑戦しておりますがなかなか理解できていません。お知恵をお貸しください。

やりたいこと:
ある入力を受けたら、別ファイルに照会して特定列の文字列を抽出する。以下に例を示します。

入力が gad の場合(小文字です)、file1を参照する。例では一行目にGAD****があるのでこれに該当することとする。最終的にoffice が出力されるようにしたい。


file1の内容:
GAD93911 <test1> office
HOA14845 <test2> desk
ABC52311 <test3> chair
KFI33823 <test4> home

よろしくお願いいたします。

Aベストアンサー

ファイルを開いて、各行を順番に /$in\d+\s<\w+>\s(\w+)/iでマッチするものを取り出して、それを使う・・

QPerl エラーログを指定の場所に出力する場合

以下のよーに指定すればエラーログの場所を指定する事ができますが、

# エラーログ
BEGIN{ open ( STDERR, ">>./log/err_log/err.txt" ); }

たとえば変数にファイル名を入れて指定する場合は、

$err_log = "./log/err_log/err.txt";
BEGIN{ open ( STDERR, ">>$err_log" ); }

とするとエラーが出てしまいます。変数に入っているものを指定するにはどうすればいいでしょうか?

Aベストアンサー

BEGINブロックは一番最初に実行されます。
この場合、$err_log = "./log/err_log/err.txt"; より前です。
なので、open時の$err_logは空です。

$err_log=をBEGINブロックに入れるか、openをBEGINブロックから出すか、になります。


人気Q&Aランキング