• ベストアンサー

unixのperlで

UNIXのPerlでは引数は@ARGVに入ると思うのですが、 a.pl *.c "*.c" という引数を入れるとファイルが展開されそのフォルダの中の "12-1.c" とか "12-2.c" とかいう引数が、配列に1つずつ入ってきました。 引数の文字列を何の修正もなしに(できればスペースも)受け取る方法はないですか?

  • Perl
  • 回答数3
  • ありがとう数4

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

  • ベストアンサー
  • natural
  • ベストアンサー率37% (419/1115)
回答No.1

a.pl "*.c" といった具合に引数文字列を二重引用符で括ってみて下さい。

haporun
質問者

お礼

んんん、呼び出し側で制御しなければダメですか? できれば、呼び出し側では正規表現を記述して、内部でそれに該当するファイルを操作したいと思っているのですが・・・。

その他の回答 (2)

  • natural
  • ベストアンサー率37% (419/1115)
回答No.3

引数のワイルドカードの展開はスクリプトに渡る前に行われますので、スクリプト内部での制御は無理だと思います。 tujigeさんの仰るような方法があれば出来ると思いますが、それとて別な環境で実行された場合は無効になってしまいます。 ですので、スクリプト自身での制御は不可能、というのが私の意見です。 御参考までに。

haporun
質問者

お礼

わかりました。 使う側でダブルクォートで囲む方法にします。

  • tujige
  • ベストアンサー率68% (13/19)
回答No.2

*.c とかは、shell が展開しちゃうので、お使いの shell の設定で展開しないようにしちゃえばいいのでは。 bash 2以上なら、braceexpand (スペル自信なし)というオプションがあったような。。。 今ざっと、bash のマニュアルを読んでみたら、展開するオプションはあったけど、展開しないオプションは見つからなかった。 多分あるのだろう。

haporun
質問者

お礼

使っているのはtcshで、管理者ではないので、ユーザー個別の設定でなんとかできれば良いのですが・・・。

関連するQ&A

  • sedやperlでの2バイト文字を含む変換

    こんにちは。 sedコマンドは、texに付属していた日本語対応のものを使用しており、 perlはWindows用のActive Perl v.5.12.2を使用しています。 カレントディレクトリにあるファイルやフォルダにおいて、 名前を一括して変換したいと思い、以下のようなNameConv.batというバッチスクリプトを作成しました。 ____________________________________________________________ @echo off for /f "delims=" %%a in ('dir /b !opt!') do ( for /f "usebackq delims=" %%b in (`echo %%a^| sed -e "s/%~1/%~2/g"`) do ( move /y "%%a" "%%b" 1>nul 2>nul if not "%%a"=="%%b" echo 「%%a」→「%%b」 ) ) ____________________________________________________________ このバッチスクリプトを NameConv.bat " " "_" の様にして呼び出すと上手く行きました。 (この場合は、カレントディレクトリの全てのディレクトリとフォルダの名前において、 スペースがアンダーバーに変換されました。) ところが、 NameConv.bat "スペース" " " のように、第一引数に変換文字列に2バイト文字を使用すると、 以下のようなエラーメッセージが出て上手く行きませんでした。 sed: -e expression #1, char 14: Unterminated `s' command どうやら、 echo %%a| sed -e "s/スペース/ /g" といったコードは、上手く行かなかったようです。 そこで、この問題を解決しようと、以下のようなNameRep.plというPerlスクリプトを作成しました。 ____________________________________________________________ #日本語を扱うために必要な設定 use encoding "cp932"; use open ":encoding(cp932)"; use open ":std"; map{ binmode($_,":crlf"); } qw/STDIN STDOUT STDERR/; #置換操作 $name="$ARGV[0]"; $name =~ s/$ARGV[1]/$ARGV[2]/g; print "$name"; ____________________________________________________________ そしてこのスクリプトを for /f "delims=" %a in ('dir /b') do ( @perl NameRep.pl "%a" "スペース" "_" ) の様にしてコマンドラインから呼び出すことで、「スペース」という文字列が、 きちんと処理できるかを試したところ、以下のようなエラーメッセージが出ました。 Unmatched [ in regex; marked by <-- HERE in m/\x{00d8}\x{00f9}\x{005b} <-- HERE \x{00d8}/ at C:\Users\kei\NameRep.pl line 11. どうやら $name =~ s/$ARGV[1]/$ARGV[2]/g; の部分で、$nameや$ARGV[1]に2バイト文字が含まれていると、上手く行かないようです。 #日本語を扱うために必要な設定 以下のコードブロックで、シフトJISに対応できるはず(少なくとも今までは問題なく扱えました) なのですが、何故か上手く行きません。 そこで、sedコマンドやperl、特にperlにおいて、シフトJISコードでの2バイト文字の扱い方を御存じの方に、何かアドバイスを頂きたいと考えています。 長くなりましたが、どうぞよろしくお願い致します。

    • ベストアンサー
    • 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 から unix コマンドを入力する方法

    perl から unix コマンドを入力するには、どのようにしたらよいのでしょうか。 具体的には、フォームから受け取った文字列を、useradd に渡して、ユーザーの追加をしたいのです。 perlスクリプトの所有者はrootで、属性はsetuid(4755)にしています。

    • ベストアンサー
    • Perl
  • shとperlのデータ連携&perl出力

    初めて記載します。宜しくします。 perlでプログラムするのが初めてでなので、大分間違ってるかもしれません。 ※UNIX環境でシェルで日付差分(yyyymmddhhmmss)を求めたいのですが、「date -d」コマンドは使用出来ません。 シェルを実行しコマンドラインにて入力された【引数1】:実行区分(1 or 2)【引数2】:日付(yyyymmddhhmmss)、【引数3】:日付(yyyymmddhhmmss)と区分をperlに引数として渡して、perlでは"引数3-引数2"をして日数を算出しファイルに出力させたいです。 perl名:MCPFZAR_Compl.pl 実行コマンド例: perl MCPFZAR_Compl.pl 1 20110302000000 20110306000000 以下にperlのプログラムを掲載します。 #!/opt/perl/bin/perl ⇒入力パラメータチェック実行 # 日付1を年、月、日、時、分、秒に切り分け $L_Year = int(substr($ARGV[1],0,4)); $L_Mon = int(substr($ARGV[1],4,2)); $L_Day = int(substr($ARGV[1],6,2)); $L_Hour = int(substr($ARGV[1],8,2)); $L_Min = int(substr($ARGV[1],10,2)); $L_Sec = int(substr($ARGV[1],12,2)); # 取得日付チェック関数を実行する。 ($L_Ret, $L_Ret_Msg) = &MCPFLCF_DayExists($L_Year, $L_Mon, $L_Day, $L_Hour, $L_Min, $L_Sec); # 異常終了した場合 if( $L_Ret != 0 ){ # エラーを返却する。 return ($L_Error_End, "$L_Err_MSG_4 [$L_Ret_Msg]"); } # 日付1を秒に変換 $L_Time1 = timelocal($L_Sec, $L_Min, $L_Hour, $L_Day, $L_Mon - 1, $L_Year); ⇒同様に日付2も変換 # 日付1と日付2の差分を取る。 $L_TimeRet = ($L_Time2 - $L_Time1); # ファイルに書き込む為に、ファイルopenしてから書込み open (OUT,"> $outfile"); # 結果形式種別が1の場合 if($ARGV[0] == 1){ # 結果を日数で参照渡しする。 $L_LET = int($L_TimeRet / (60 * 60 * 24)); print OUT "$outfile"; } # 結果形式種別が2の場合 elsif($ARGV[0] == 2){ # 結果を秒で参照渡しする。 $L_LET = $L_TimeRet; print OUT "$outfile";; # CLOSEする close(OUT); シェルを実行すると、エラーにはなりませんが ファイルの出力もされません。 かなりどうしたらよいかわからない状態なので回答宜しくお願い致します。 足りない情報がありましたらご教授願います。

    • ベストアンサー
    • Perl
  • UNIXでのプログラム

    UNIXでのシャルスクリプトでもAWKでもいいのですが以下のようなことがやりたいのですが、いい方法が思い つきません。どなたか教えて下さい。 テキストファイルがあり、そのファイル中の”//”という文字から行末までは削除したファイルを作りたい。 ”//”という文字列は文字列の途中にあるケースも前後にスペースが存在して単語として存在しているケースもあります。

  • Perlで変数中のエスケープされた特殊文字を展開

    Perlで、変数に既に格納されているエスケープされた特殊文字を、もとの文字に展開するには どのようにしたらよいでしょうか。 つまり、\t という値で格納されているのをタブ文字にしたり、\\ という値であれば\の一文字に するという事です。 ダブルクォートで定義すれば展開されると思いましたが、展開は変数の代入時に行われるだけで、 既に変数中にエスケープされて入っているものはダブルクォートを使い変数を囲んだりしても展開されません。 下記は簡単な例でやろうとしてる事を示したものです。 add変数に\tというタブを意味するエスケープされた特殊文字を含んでいるとして、その\tを タブとして展開し、abc defのようにさせたいのですが、abc\tdefと入ってしまいます。 $ cat unescape.pl #!/bin/perl $add = '\tdef'; #シングルクォートで代入すると、もちろんエスケープされたまま代入される #$add = "\tdef"; #ダブルクォートで代入すると代入時にタブへ展開される #$add = $ARGV[0]; #本当はAGRVからエスケープ特殊文字を含んだ文字列を取りたい。ARGVから代入すると、シングルクォートの時のようにそのまま代入される $tgt = 'abc'; print "add: " . $add , "\n"; print "before: " . $tgt . "\n"; $tgt .= "$add"; #既にエスケープされた形で代入されているものを、ダブルクォートで囲んで使っても展開されない print "after: " . $tgt . "\n"; $ perl unescape.pl add: \tdef before: abc after: abc\tdef

    • ベストアンサー
    • Perl
  • perlと引数 その結果はshellscript

    今、仕事で、UNIXの知識もないまま、突入しています。 教えてください。 perlのプログラムに引数を与え、perlで処理した内容を shellScriptにしようとしています。 #! /usr/bin/sh myProgram.pl "mytest" > mytest.sh どうもうまく行きません。どうすればよいですか? よろしくお願い致します。

  • 文字列検索のAND条件を引数にしたい

    Perl初心者です。 指定したファイルの中から指定した文字列の入っている行を取得したいのですが、 open(FL, $ARGV[0]); while (<FL>) { if ($_ =~ /$ARGV[1]/) { print $_; } } close(FL); としたとき、 $ARGV[1]に aaa/bbb/ccc と入れてaaaかつbbbかつcccを含む行としたいのですが、うまく動作しません。 このような場合がGREPとかのコマンドを使ったほうがよいのでしょうか? 別の処理も組み込みたいので、できればperlで書きたいのですが、正規表現の文字列を引数で与えるようなことはできるのでしょうか? よろしく御願いします。

    • ベストアンサー
    • Perl
  • .forwardから呼び出すperlプログラムに引数を付ける事は可能ですか?

    はじめまして。Perlの初心者ものです。 よろしくお願い致します。 .forwardから呼び出すperlプログラムに引数をつけて プログラム内で引数とメール内容を処理に使用したいので すが、出来るのでしょうか? 例えば.forwardの中身を |/XXX/test.pl p1 と、記入して、 test1.pl内で引数によって、メールの内容を違ったファイルに保存したいです。 よろしくお願い致します。

  • perlで列の抜き出し

    a,b,c,d 1,2,3,4 5,6,7,8 以上のような配列のデータを読み込んだときに、 c 3 7 のように縦の列のデータを抜き出すプログラムを考えています。 これはどのように記述すればよいでしょうか。 二次元配列はperlでは不可能と言うことであまりperlでは難しいでしょうか。

専門家に質問してみよう