perlのsystem関数内で変数展開について困っています。変数展開はできるのですが、その変数の後に':'(コロン)をつける必要があるのですが、それがモディファイアとして認識されてしまうようです。コロンをそのままperlに評価させずにsystem(shell)に渡す方法はないでしょうか?
$host = "xxxx.com";
system("program ${host}:22");
ちなみに、$host:22ではうまく変数展開されないそうで、{}を使うまでは良かったのですが、その後のコロンでつまっています。programの都合でhost、コロン、ポート番号を渡す仕様のため変更できません。よろしくお願いします。
No.3ベストアンサー
- 回答日時:
「シェルのモディファイア」で変換されてしまう、という話なら、Perlは直接関係ありません。
方法として
・シェルで変換しないようなコマンドラインを、system関数に渡す
# ただ、 xxxx.com:22 をなんかに変換してしまうようなシェル、というものに思い当るものがありません。
・引数をリストにしてsystemを実行することで、シェルを通さないで実行する
system('program', "${host}:22") ;
http://perldoc.jp/func/system
http://perldoc.jp/func/exec
これでだめなら、別の問題でしょう。
# $hostの後ろに空白とか改行コードとかが付いてるとか
ちなみに、コマンドラインシェルから program xxxx.com:22 を実行したらちゃんと動作するのですか?
// まちがって別のにリプライをつけてしまいました。正しくはこちらです。
遅くなりましたが、元のスクリプトを分離してテストケースを作成しました。programは実際にはstoneというものです。
さて、コマンドラインからは実行できます。
$ stone `cat ~/remotehostname`:22 1026 -> OK
$ stone stone $remotehostname:22 1026 -> OK
これは自ホストのポート1026に来たパケットをリモートの22にフォワードするもので、両方共動作しました。
これが動作したということはシェルのモディファイアじゃないですね。これもシェルが評価しているんだし。
さて、以下のテストケースを実行すると、
#! /usr/bin/perl
$remotehostname = `cat ~/remotehostname`;
system("stone ${remotehostname}:22 1026");
Invalid <host>:<port>: 048.112137072.m-net.ne.jp
sh: line 2: :22: command not found
このようにホストの後に改行があって:22というコマンドが無いと出ます。これを見てモディファイアかと誤解したのですが、どうもそうではなく、ご指摘のようにホスト名の後の改行を誤って(正しく?)認識しているようです。
であれば、簡単で
chop($remotehostname);
これを挿入することで正しく動作することができました。ありがとうございました。ホスト名の後の改行が大きなヒントでした。
No.2
- 回答日時:
もちろんそれでいいわけですが....>#1
ただ, 実際試すとこの場合コロンは全く悪さをしないんですよ. 例えば
use feature 'say';
$host = "example.com";
say "$host:22";
では (想定通り) example.com:22 が出力されるんですな.
「モディファイア」ってなんだろう.
遅くなりましたが、元のスクリプトを分離してテストケースを作成しました。programは実際にはstoneというものです。
さて、コマンドラインからは実行できます。
$ stone `cat ~/remotehostname`:22 1026 -> OK
$ stone stone $remotehostname:22 1026 -> OK
これは自ホストのポート1026に来たパケットをリモートの22にフォワードするもので、両方共動作しました。
これが動作したということはシェルのモディファイアじゃないですね。これもシェルが評価しているんだし。
さて、以下のテストケースを実行すると、
#! /usr/bin/perl
$remotehostname = `cat ~/remotehostname`;
system("stone ${remotehostname}:22 1026");
Invalid <host>:<port>: 048.112137072.m-net.ne.jp
sh: line 2: :22: command not found
このようにホストの後に改行があって:22というコマンドが無いと出ます。これを見てモディファイアかと誤解したのですが、どうもそうではなく、ご指摘のようにホスト名の後の改行を誤って(正しく?)認識しているようです。
であれば、簡単で
chop($remotehostname);
これを挿入することで正しく動作することができました。ありがとうございました。ホスト名の後の改行が大きなヒントでした。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB.NETからPerlを呼び出す
-
DBIのupdateのプレースフォルダ
-
「デバイスは PRN を初期化でき...
-
LCD ディスプレイを Raspberry ...
-
perlについて
-
Spreadsheet::ParseExcelを使っ...
-
Pg.pmモジュールがロードできない
-
EXECEL VBA コマンドボタンか...
-
Excel VBA 『Call』で呼び出す...
-
【ExcelVBA】commandButtonをク...
-
VBAで2重のDoLoop関数から抜け...
-
例外処理のフローチャートの記...
-
vba userFormのSubを標準モジュ...
-
エクセルVBAでシートモジュール...
-
他Book(シートモジュール)のマ...
-
VBでグローバル変数を宣言するには
-
VBA モジュールを閉じるショー...
-
Cからシェルを起動し返り値をハ...
-
警告を消したい
-
エクセルVBA クラスモジュール...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Perlソースコードをコンパイル...
-
プロシージャの戻り値を取得す...
-
Perlで環境変数を設定するには
-
system関数でCシェルコマンドを...
-
cgiを実行可能にするには
-
外部CGIの実行結果を変数内に取...
-
UNIX SUN Solarisで時間の演算
-
VB.NETからPerlを呼び出す
-
Cygwin上でperlスクリプトの実行
-
system関数を使用してJava実行...
-
これをビジュアルスタジオで実...
-
Perlスクリプトが実行できない...
-
-i -e "s|^.|ok|" ./text どこ...
-
perlで 引数1を別リストの複数...
-
Apacheのログからアクセス履歴...
-
Perl リスト内指定回数繰り返し
-
DBIのupdateのプレースフォルダ
-
Windows版Perlの標準入力&標準...
-
コードを一行ずつ実行したい。
-
例外処理のフローチャートの記...
おすすめ情報