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で質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセル 関数について質問です。 2 2022/10/03 11:14
- 数学 多変数関数の微分とテイラー展開について 5 2022/04/24 16:55
- Visual Basic(VBA) 【再々投稿】VBAのプログラムで動作しなくて困っています 8 2022/10/14 09:06
- Perl perlで2次元配列をサブルーチンに値渡しで渡す 5 2022/12/17 18:49
- Perl perlをバージョンアップしたら、今まで正常に動いていたプログラムが、エラーになってしまった 3 2022/10/05 15:44
- Excel(エクセル) エクセル関数の変わった使い方 3 2022/05/13 17:12
- 数学 複素関数と実関数のテーラー展開の違いについて 1 2022/08/09 06:18
- イヤホン・ヘッドホン・補聴器 ワイヤレスイヤホン コロンについてです! 最近購入したのですが説明書にはイヤホンをケースに入れ蓋を閉 2 2022/10/23 18:28
- Excel(エクセル) If関数に関する質問です。(再掲) 3 2022/10/01 20:51
- Perl perlでリテラル値はメモリにどのように格納されているか? 1 2023/01/15 20:45
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Perlソースコードをコンパイル...
-
Excel VBA 定義されたプロージ...
-
ユーザー定義関数に#NAME?が返...
-
ArduinoのジャイロモジュールMP...
-
エクセルVBAでシートモジュール...
-
例外処理のフローチャートの記...
-
VBA This Workbookモジュール...
-
ユーザーフォームに最小化・最...
-
【vba】フォームに書いてあ...
-
Excel VBAでリンク切れをチェッ...
-
VBA モジュールで共通に使う変...
-
Pg.pmモジュールがロードできない
-
VBでグローバル変数を宣言するには
-
グラフのX,Y座標を取得したい
-
vba 標準モジュールインポート...
-
Excel VBAで、ユーザーフォーム...
-
印刷後メッセージボックスを表...
-
VBAで別モジュールへの変数の受...
-
PCをWI-FI化(現在は有線)
-
VBAで旧字体を異字体に一括で変...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Perlソースコードをコンパイル...
-
プロシージャの戻り値を取得す...
-
Perlで環境変数を設定するには
-
systemの引数の中括弧
-
system関数を使用してJava実行...
-
perlでコマンドプロンプト実行
-
Perlのexitについて
-
PERLからcshellを実行したいの...
-
Cygwin上でperlスクリプトの実行
-
Perlスクリプトが実行できない...
-
pp (Perl Packager) で require...
-
Excel VBAでリンク切れをチェッ...
-
Excel VBA 定義されたプロージ...
-
例外処理のフローチャートの記...
-
ArduinoのジャイロモジュールMP...
-
ユーザー定義関数に#NAME?が返...
-
「デバイスは PRN を初期化でき...
-
VBAで別モジュールへの変数の受...
-
Excel VBA 『Call』で呼び出す...
-
エクセルVBAでシートモジュール...
おすすめ情報