人に聞けない痔の悩み、これでスッキリ >>

お世話になります。
分からないならではの質問かと思いますが、
標題の通りです。

cgiXの中からcgiYを呼び出したい(コントロールを渡したい)
のです。
どう考えればよいのでしょうか。

これまでは、formのactionにcgi名を書き、
submitによってコントロールを渡してきました。

submitせず単純にコントロールを渡したいのです。
宜しくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (7件)

また具体例忘れてました。


出力HTMLの先頭にMETAタグで
<meta http-equiv="Refresh" content="15;URL=http://www.test.com/パス/cgiY.cgi">
などとすれば表示15秒後に指定のCGIにとびます。
追伸:
前の回答でREFRESHのつづり間違えてました。スイマセン。
    • good
    • 0
この回答へのお礼

何回もまことに有り難うございます。
解決しました。

全ていわれていることは理解できたのにうまくいかないので、
一から見直しましたところ、
print "Content-type: text/html\n\n";
が冒頭に入っていました。

これを各rtnに移したところ、あっけなく解決してしまいました。
大変お世話になりました。
(昨日当サイトのメンテのためにお礼が遅くなりました)

お礼日時:2008/04/17 06:14

お察しの通りです。


Locationより先に他のHTTPヘッダを出してしまうとLocation部分はコンテンツの1部として認識されてしまいます。
ブラウザ側の命令の受付は一回こっきりですから制御をうつしたいのなら何も表示してはいけません。
いったん表示させてから移したいのなら出力HTML内に仕込むしか方法はありません。
手っ取り早い方法としては<META>タグのRefleshを使うかJavaScriptしか手は無いでしょう。
    • good
    • 0

本当にすいません。


誤解のないようにもうちょっと具体的に書きます。
↓↓↓↓↓↓↓↓↓↓↓↓↓この下から
#!/usr/local/bin/perl

## ここにあなたの処理:ただしprint文など表示系の命令は一切無し

## 最後にこれ↓
print "Location: ./cgiY.cgi\n\n";
↑↑↑↑↑↑↑↑↑↑↑↑↑この上まで
以上です。
    • good
    • 0
この回答へのお礼

何回も有り難うございます。
ここが問題でして。

>#!/usr/local/bin/perl
 これはcgiの全く頭(1行目)ですよね、

>## ここにあなたの処理:
 ここが問題です、
 具体的にはここにデータの吐き出しを書いています。

>ただしprint文など表示系の命令は一切無し
 データの書き出しはありませんが、
 サブrtnでhtmlは書き出しています。
 これが駄目なのでしょうか。

>print "Location: ./cgiY.cgi\n\n";
 これがそのまま出て(表示)されてしまいます。
 
やはり、直下にないというのが原因でしょうか。
しつこくて済みません、
宜しくお願いします。

お礼日時:2008/04/15 10:48

たびたびすいません。


具体例忘れてました。
#!/usr/bin/perl
print "Location: ./cgiY.cgi\n\n";
だけです。
    • good
    • 0

HTTPヘッダについて


エンドユーザが使用しているブラウザへの命令だと思ってください。
命令のケツは「\n\n」であることをまず念頭において・・・。
通常のCGIだと「Content-type: text/html\n\n」がエンドユーザのブラウザに渡されてそれ以降をHTMLのテキストデータが来るよと判断されその処理を行ないます。
「Content-type: text/html\n\n」ならベタテキスト。
「Content-type: image/png\n\n」ならPNGのバイナリデータ。
という具合なのですが、
それらは「Content-type」というぐらいなので内容のタイプを指定しますよというのがわかります。やろうと思えばCSVデータを送ってExcelでデータを開かせることも可能です。
他にもいろいろあるのですが、ここにアクセスしろ!というのが「Location:」なのです。
こんな感じでわかります?
    • good
    • 0
この回答へのお礼

早速具体的に有り難うございました。
よく分かります。
こういっては何ですが、そうかなと思っていました。

お礼日時:2008/04/15 10:43

単純に渡すだけならHTTPヘッダ使って


print "Location: ./cgiY.cgi\n\n";
と書いてはどうでしょう。
データを渡したい場合、GETメソッドならそのまま上記CGI名以降にパラメータをつけてやればよいのですが、POSTするとなるとcgiY.cgiの作り方しだいになってしまいます。
1.systemやexecを使ってパラメータとして渡す → CGIのPOSTメソッドでは渡されないので@ARGVを使う(これは厳密にはCGIとはいいがたいし、処理終了時にはcgiXに制御が戻る)
2.Socketなどモジュールを使って自身のサーバにポート80にアクセスして、HTTPリクエストでCGI指定し、「Content-Length」でデータサイズとデータをPOSTする。
3.面倒なのでやってみたことはありませんがSTDINに直接パラメータを入れることも可能かも知れません。

回答になってますでしょうか?
    • good
    • 0
この回答へのお礼

有り難うございます。
まさに単純に渡すだけでよいのです、
パラメーターも何も不要です。
ただ、
>HTTPヘッダ使って
が分からないのです。
実は同じことをperlジャンルで聞いたところ、
同じことを教わりました。
その時にも分からなくて、調べた結果、
javascriptにたどり着いてしまい、
<html>
<head>
,,,,,,,
location: http://,,,,
と書いたところうまく渡せたのですが、
この場合はjavascriptなので、携帯電話では使えず途方に暮れたのです。

そしてもう少し調べた結果、
perlでもこのHTTPヘダーがあるという事は分かったのですが、
実際に動いたのは、
#!/usr/local/bin/perlの直下に書いたときのみでした。

やりたいことは、
cgiXの中で単純にいろいろやりたいことを書き、
最後にcgiYにコントロールを渡せればokなのです。

ということで、
具体的な書き方を教えていただければ嬉しいのですが。

やりたいことがうまく説明できずに申し訳在りません。
いいたいことは、cgiYにコントロールを渡すのですが、
javascriptではなく、perl(cgi)で解決したいのです。

なにとぞ宜しくお願いします。

お礼日時:2008/04/14 21:41

お作りになられている cgi の構成が不明ですが、・・・



その cgi を単なるアプリケーションと捉えて、cigX から直接 cgiY を呼び出す(call) すれば良いと思います。
    • good
    • 0
この回答へのお礼

早速有り難うございました。
まさにcallしたいのですが、
具体的にはどうコーディングするのでしょうか。

サブrtnだと &XXXで、これは使っていますが、
callという命令(?)は知りません。

宜しくお願いします。

お礼日時:2008/04/14 14:40

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

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

QHTML上(javascript)からCGIを実行する方法

javascriptから外部実行ファイル(javascriptファイルではなくperlなどのCGI)
を実行する方法を探しています。
下記のようにindex.htmとtest.cgiファイルを用意して、index.htm内の
javascriptから外部cgiを実行させ、cgiの結果(test.cgiでは単に
『test』と表示するのみ)を表示したいと考えています。

利用増ですが、cgiやssiが使用できないサーバにindex.htmを置いて、
cgiが使用できるサーバ上のcgi結果を取得したいものです。
通常のcgiのように、1ページでcgi結果を表示するものではなく、
HTMLファイルの一部にcgi処理結果を表示させたいものです。

そもそも、SSIを使用しなければ下記のようなHTML内にcgiなどの
実行結果を表示する事は出来ないのでしょうか。
よろしくお願い致します。

※下例のプログラムではcgi結果は表示されませんでした・・・。

---<index.htm>----------------------------------------
<HTML>
<BODY>
<SCRIPT language="Javascript" src="http://xxx.xxx.xxx.xxx/test.cgi"></SCRIPT>
</BODY>
</HTML>

---<test.cgi>----------------------------------------
#!/usr/bin/perl

print "test"

javascriptから外部実行ファイル(javascriptファイルではなくperlなどのCGI)
を実行する方法を探しています。
下記のようにindex.htmとtest.cgiファイルを用意して、index.htm内の
javascriptから外部cgiを実行させ、cgiの結果(test.cgiでは単に
『test』と表示するのみ)を表示したいと考えています。

利用増ですが、cgiやssiが使用できないサーバにindex.htmを置いて、
cgiが使用できるサーバ上のcgi結果を取得したいものです。
通常のcgiのように、1ページでcgi結果を表示するものではなく、
HTML...続きを読む

Aベストアンサー

「Google AdSense」のjavascriptでは#1さんの回答にもありますがiframeを使用するような仕掛けになっているようです。
・javascriptでiframeを展開。
・iframeのsrcでcgiを指定。

>外部cgiでjavascriptを生成する仕組みを作り、その生成されたjavascriptを参照するという間接的な仕組みを設ければ可能になる
そういう仕組みも可能です。
また、直接的に<script type="text/javascript" src="xxxx.cgi"></script>
こういう書き方も可能です。
※xxxx.cgiでは処理結果をjavascriptのコードとして
print "Content-Type: application/x-javascript\n\n";
print "document.write('xxxx');";
みたいにして吐き出す必要があります。

Qcgiからcgiを呼び出す方法

perlのcgi製作を始めて7日目の素人で恐縮ですが、教えてください。

タイトルのキーワードで検索し、いろいろ試しておりますがうまく動作しません。
■試した例
exec("./cgi A.cgi")
<!--#exec cgi="./cgi A.cgi"-->

もともと単体で動作していたcgi Aに対して新たにcgi Bを作成し、
cgi Bからcgi Aを呼び出したいのですが、うまくいきません。
 cgi A:アンケート回答フォームのようなもの
 cgi B:認証フォーム(コードを入力してDB内のデータと一致したらcgi Aを呼び出したい)

自分のPCにApacheをインストールし、ローカルで実行しております。
cgi Bはcgi Aを呼び出す部分をコメントアウトすれば動作します。

どなたか良きアドバイスをよろしくお願いします。

Aベストアンサー

> exec("./cgi A.cgi")
> <!--#exec cgi="./cgi A.cgi"-->

これ、何を意図したものですか? ./cgi ってなんです?
この書式だと、 ./cgi(カレントディレクリのcgiというコマンド)に A.cgi を引数にして実行しようとします。おそらく、cgiなんて実行ファイルや命令は無いでしょうから失敗するでしょう。


方法としては次のものが考えられます。

・正しく A.cgi を実行する
PCでApache使ったことないので、どうなるか確認取ってませんが、 A.cgi が単独で実行できるなら
exec("A.cgi") ;
あるいは、Perlコマンドを指定して
exec("perl A.cgi") ;
A.cgiにパラメータを渡すなら、仕様にしたがって。

あと、httpのヘッダが重複しないように注意。


・ location や refresh を使って、 A.cgiのURLへリダイレクトする。

QPerlプログラム上でアラートを表示

現在、Perlにてチェックプログラム(チェック内容は省かせていただきます)を作っています。

もともとはweb上で「登録」をクリックすると以下のような csh で記述されたcgiが実行され、
------------------------------
#!/usr/bin/csh
echo "Content-type: text/html"
echo ""
~中略~
./既存プログラムA.exe
------------------------------
最終的に「既存プログラムA.exe」が起動するというような物で、今回この「既存プログラムA.exe」が起動される直前にチェックプログラムを実行するというものです。

前置きはこのような感じで、教えていただきたい内容は、
チェックプログラム内の記述に以下のようなチェック項目があります。
------------------------------
if(!(-e $CIRCUIT)){
print"END";
exit(0);
}
------------------------------
「$CIRCUIT」というフォルダが存在するか否か、存在すれば次のチェック項目へ、存在しなければ処理終了というような単純な構文なのですが、
このif文内に、"そのようなフォルダはありません"アラートを表示させるような記述を追加することは可能でしょうか?

サンプルURLや情報等お持ちの方いらっしゃいましたら、
よろしくお願いいたします。

現在、Perlにてチェックプログラム(チェック内容は省かせていただきます)を作っています。

もともとはweb上で「登録」をクリックすると以下のような csh で記述されたcgiが実行され、
------------------------------
#!/usr/bin/csh
echo "Content-type: text/html"
echo ""
~中略~
./既存プログラムA.exe
------------------------------
最終的に「既存プログラムA.exe」が起動するというような物で、今回この「既存プログラムA.exe」が起動される直前にチェックプログラムを実行するというも...続きを読む

Aベストアンサー

ウェブ上でアラートを出すなら
print <<END;
<script>
alert('メッセージ');
</script>
END
とかしてみたらどうでしょう。
(未確認自信なし)

QCGI動作後に元のページに戻る方法

Perl , javascript 初心者です。
あるページの一番下に,チェックボックスを設置して選択してもらうという簡単なアンケートを作っています。
submit ボタンを押した後,CGI(Perl) で処理を行い,その後元のページの元いた場所(アンケートがあるところ)を表示させることはできますか?
また,できれば submit ボタンの横に「ご協力ありがとうございました」というコメントを表示したいと思います。

良い方法があれば教えて下さい。

Aベストアンサー

perlでは、
print "location: (URL)\n\n";
これでページを呼び出します。
同じフォームに戻らなくても、お礼のページを作った方が良いと思います。
どうしても、フォームに戻るなら、CGIから戻ってきたことが判るようにURLの後ろに「?back」などと識別コードを付けます。
そして、HTML内にJavaScriptを埋め込み、自分自身のURLを調べれば、普段のURLと違うことが判ります。

QCGIでソースがそのままでてしまうのですが・・・。

CGIでソースがそのまま表示されてしまうのですが、どうしてなのでしょうか?

先週からCGIやPerlを学び始めました。そこで簡単なものを試しに作ってみたのですが、入力したソースがそのまま表記されてしまいます。

ちなみに、こんなものです。

#! c:/perl64/bin/perl

print "Content-type: text/plain\n\n";
print "Hello Perl !";

どこをどう変えればいいのか、わからないので、質問してみました。

わかる方がいましたら、教えてください。

初心者なので、お手柔らかにお願いします。

.





この質問に補足する.

Aベストアンサー

CGIスクリプトのソースがそのまま出力されるのは、そのファイル/URIがCGIとして実行できていないためです。

httpd.confの<Directory>ディレクティブや<Location>ディレクティブなどの指定箇所が間違えているか、
ファイルの拡張子を間違えているか、
httpd.confを書き換えてからApacheをリスタートしていないか。。。


Forbiddenが出てきたら.cgiファイルに実行権限が無い。
Internal Server Errorが出てきたら、Perlがインストールされていないか.cgi拡張子とPerlが関連づけられていない。

ということが考えられます。

Q結果を得て自動的にページ移動を行うには?

CGIプログラムの初心者です。取り合えず作ってみようと思いまして、本を片手に「診断系の占い」のプログラムを書き始めました。生年月日を入力して性格を占う(?)、いわゆる「動物占い」とか「星座占い」のようなやつです。

入力した生年月日から数値を導き、その数値を元に数通り用意した結果のページ(HTML)へ移動させるようにしたいのですが、移動のさせ方がよくわかりません。CGIの中にHTML文書を書いて表示させるのではなくて、別に用意したHTMLのページへ移動させるにはどうしたらいいのでしょうか?

とりあえず
print "Content-type: text/html\n\n";
print <<EOF;
<html>
<head>
<meta HTTP-EQUIV=\"refresh\" CONTENT=\"0; URL=$kekka\">
<title>占いの結果です</title>
</head>
#以下略します
#$kekka ←この変数にアドレスを代入してます。

という感じで、<meta>を入れて移動させるようにしてみたんですけど、もっと正攻法があるんじゃないかな?と、疑問を感じました。
申し訳ありませんが、教えていただけると嬉しいです。

CGIプログラムの初心者です。取り合えず作ってみようと思いまして、本を片手に「診断系の占い」のプログラムを書き始めました。生年月日を入力して性格を占う(?)、いわゆる「動物占い」とか「星座占い」のようなやつです。

入力した生年月日から数値を導き、その数値を元に数通り用意した結果のページ(HTML)へ移動させるようにしたいのですが、移動のさせ方がよくわかりません。CGIの中にHTML文書を書いて表示させるのではなくて、別に用意したHTMLのページへ移動させるにはどうしたらいいのでしょうか...続きを読む

Aベストアンサー

別にその方法でもいいと思いますが、その他には「Locationヘッダでリダイレクトさせる」方法や「結果ページのHTMLを読み込んで表示する」方法などが考えられます。

Location の場合、
 print "Location: $kekka\n\n";
とだけ出力すればOKです。
META の Refresh による方法と、ほぼ同じ結果になります。
※$kekka は、念のため絶対URLの方がよいです。

HTMLを読み込んで表示するなら、
 print "Content-Type: text/html\n\n";
 if (open(FH, "< $file")) {  # $fileには、$kekkaに相当するHTMLのファイルパスを指定
   print <FH>;
   close FH;
 }
 else { print "Error: $!" }
という感じ。
こっちの方がMETAやLocationで飛ばすより、早くページが表示されます。

Qhttpdの子プロセスがゾンビ化する原因

httpdは複数の子プロセスを生成しますが、この子プロセスがゾンビプロセス化してしまう
ことがあります。
このゾンビ化してしまう原因として考えられるものを教えて下さい。

『何らかの理由で子プロセスが停止せずに親プロセスが停止した』等、あいまいな答えでも
構いません。もちろん具体的であれば、とても助かりますが…。

思いつく限りいくつでも構いませんので、教えて下さい。

ちなみに、私が使用しているマシンで上記現象が発生している訳ではなく、一般的な事例として
子プロセスのゾンビ化の原因になり得る事象を知りたいと思っていますので、構成情報などは
あまり気にせずに答えて頂けると幸いです。

よろしくお願いします。

Aベストアンサー

ゾンビプロセス一般について書きます。

ゾンビプロセスとは、プロセスの実体は無いが、プロセステーブル(カーネルがプロセスを管理してる台帳)に
エントリーがある状態を指します。

名簿に名前があるけど、本人は居なくなっちゃってる、と。

あるプロセスが終了したときには、必ず一瞬でもこの状態になります。
通常は、プロセスが終了したというシグナルが親プロセスに通知され、親プロセスが後始末を
してあげて、めでたくゾンビ状態ではなくなるのです。

もし、親がシグナルを受けたときに適切な処理を行っていなければ、親プロセスが終了するか
システムが再起動するまで、ゾンビ状態のままです。

> このゾンビ化してしまう原因として考えられるものを教えて下さい。

子プロセスからのシグナルを受けたときの処理がまずい、のが原因です。

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

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

Aベストアンサー

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

QチェックボックスのCGIへの値の受け渡し方

チェックボックスで複数回答があった場合のデータの受け取りをどうしても分からないので教えてください。
別の人が作ったCGIを改造(今回の複数回答可の部分を)しています。以下のような記述だとvalue値が取れず、空白になっています。
【HTML】(チェックを2つ以上出来ないようにするためにJavascriptで制限をかけています。nameを同じにするやり方にしています。)
<INPUT type="checkbox" name="q1" value="赤" onclick="return limitation(this,2)">赤<br>
<INPUT type="checkbox" name="q1" value="黄" onclick="return limitation(this,2)">黄<br>
<INPUT type="checkbox" name="q1" value="青" onclick="return limitation(this,2)">青<br>
【CGI】
use CGI qw(:standard);
@check1=param("q1");
$result1=join(',',@check1);

print "<td width=300><font size=2>$result1</font></td>\n";

このPerlは@check1にq1のチェックが付いたものが格納されていると認識しています。では、どうしたらそれをとりだせるのでしょうか?初心者で申し訳ありません。やり方にこだわらず、今回の目標は
(1)チェックボックスに規定(2つ)以上のチェックが入るとアラートでチェックしすぎた瞬間に知らせてくれる
(2)2つチェックされた場合の値の取出しを可能にする。

チェックボックスで複数回答があった場合のデータの受け取りをどうしても分からないので教えてください。
別の人が作ったCGIを改造(今回の複数回答可の部分を)しています。以下のような記述だとvalue値が取れず、空白になっています。
【HTML】(チェックを2つ以上出来ないようにするためにJavascriptで制限をかけています。nameを同じにするやり方にしています。)
<INPUT type="checkbox" name="q1" value="赤" onclick="return limitation(this,2)">赤<br>
<INPUT type="checkbox" name="q1" value="黄"...続きを読む

Aベストアンサー

説明が悪かったかな。
先ほど表記したのは同じcheckboxの場合の受け取り方のテストスクリプトです。
受け取った配列をHIDDENで渡せば問題ありません。

ただ、私のほうでCGI.pmを使用したものをテストしたところ同じnameを使った場合は渡された文字列が連結されてしまうみたいです。

以下テスト用

#!/usr/local/bin/perl


use CGI;
$query = CGI->new;
$on = $query->param('on');

@params = $query->param();

print "Content-type: text/html\n\n";
print "<HTML>\n";
print "<HEAD><TITLE>test</TITLE></HEAD>\n";
print <<HTML;
<form action="chk.cgi" method="POST">
<input type="checkbox" name="q1" value="RED">RED<br>
<input type="checkbox" name="q1" value="BLUE">BLUE<br>
<input type="checkbox" name="q1" value="YELLOW">YELLOW<br>
<input type="submit" name="on" value="TEST">
</form>
HTML

if ($on) {
print "<p>変数result1: $result1</p>\n";
print "<p>配列q1<br>\n";
foreach $q1 (@check1) {
print "$q1<br>\n";
}

foreach $param (@params) {
print $param, ":\t", $query->param($param), "<br>\n";
}

}

print "</BODY>\n";
print "</HTML>\n";

exit;


以上でテストした結果:
q1: REDBLUEYELLOW
on: TEST

説明が悪かったかな。
先ほど表記したのは同じcheckboxの場合の受け取り方のテストスクリプトです。
受け取った配列をHIDDENで渡せば問題ありません。

ただ、私のほうでCGI.pmを使用したものをテストしたところ同じnameを使った場合は渡された文字列が連結されてしまうみたいです。

以下テスト用

#!/usr/local/bin/perl


use CGI;
$query = CGI->new;
$on = $query->param('on');

@params = $query->param();

print "Content-type: text/html\n\n";
print "<HTML>\n";
print "<HEAD><TIT...続きを読む

Q文字コードの変換(Shift-JISからUTF8)

文字コードがShift-JISのCSVファイルを読み込み、UTF-8のテキストファイルに出力するのに
プログラムの中で変更しようとしているのですが、うまくいきません。出力ファイルの文字コードを
確認するとShift-JISのままです。
どなたか教えていただけないでしょうか?
ActivePerl v5.16.0を使用し、Encodeモジュールのfrom_toを使用しています。

#!/usr/bin/perl

use strict;
use warnings;

use utf8;
use Encode;

my $input_file="input.csv";
my $output_file="output.txt";
open (IN, $input_file) or die "$!";
open (OUT, ">$output_file") or die "$!";

while (<IN>){
chomp ($_);
my @data=split(/,/,$_);

for(my $i=0;$i<@data;$i++){
$data[$i]=Encode::from_to($data[$i],'shiftjis','utf8'); #Shift-JISからUTF-8に変換
$data[$i]=~s/\s+//g;
print OUT $_;
}
print OUT "\n";
}
close (IN);
close (OUT);

文字コードがShift-JISのCSVファイルを読み込み、UTF-8のテキストファイルに出力するのに
プログラムの中で変更しようとしているのですが、うまくいきません。出力ファイルの文字コードを
確認するとShift-JISのままです。
どなたか教えていただけないでしょうか?
ActivePerl v5.16.0を使用し、Encodeモジュールのfrom_toを使用しています。

#!/usr/bin/perl

use strict;
use warnings;

use utf8;
use Encode;

my $input_file="input.csv";
my $output_file="output.txt";
open (IN, $input_file) or die "$!...続きを読む

Aベストアンサー

あの、私のや他の回答をよく読んで考えてください。


for(my $i=0;$i<@data;$i++){
$data[$i]=Encode::from_to($data[$i],'shiftjis','utf8'); #Shift-JISからUTF-8に変換
$data[$i]=~s/\s+//g;
print OUT $_;
}

この部分は **** $_には何の影響も与えません ****
よって、** 出力に関することだけに注目したら **

for(my $i=0;$i<@data;$i++){
print OUT $_;
}

これと等価です。どこで「Shift_JIS からUTF-8へ変換」してますか?
$_は「while (<IN>){」の<IN>で1行読み込まれ、「chomp ($_);」で末尾の改行コードが削除されただけで、移行なにも変化していません。コードは入力のまま=Shift_JISです。それをそのまま出力すればShift_JISになるのが正解です。
しかも、項目数分だけ繰り返し出力されます。
(重複行になる、と#1に書いたのはchompのことを失念していた私のミスです)

@dataを変更したのなら、出力するのは@dataでしょう。
join(",", @data)とすれば、項目をカンマ区切りの文字列にすることができます。


あと#2にあったfrom_toの使い方。マニュアルをよく読みましょう
http://perldoc.perl.org/Encode.html#[$length-=]-from_to($octets,-FROM_ENC,-TO_ENC-[,-CHECK])
・$octetsを直接変換する
・$octetsの長さを返す
とあります。つまり
$data[$i]=Encode::from_to($data[$i],'shiftjis','utf8')
だと,$data[$i]には元の内容は破棄されて、文字列の長さになってしまいます。



各項目毎に処理したい、という意図はわかりました。

ですが、文字コードの変換が項目毎に違うなんてことはまず無いでしょう。
それならば、$_で1行をコード変換→splitして項目毎の処理、としてもいいのでは?

ついでにPerlIOを使って
open (IN, "<:encoding(shift_jis)", $input_file) or die "$!";
open (OUT, ">:utf8", $output_file) or die "$!";
とでもやれば、プログラム中はコードをあまり意識せずに文字列処理ができます。

あの、私のや他の回答をよく読んで考えてください。


for(my $i=0;$i<@data;$i++){
$data[$i]=Encode::from_to($data[$i],'shiftjis','utf8'); #Shift-JISからUTF-8に変換
$data[$i]=~s/\s+//g;
print OUT $_;
}

この部分は **** $_には何の影響も与えません ****
よって、** 出力に関することだけに注目したら **

for(my $i=0;$i<@data;$i++){
print OUT $_;
}

これと等価です。どこで「Shift_JIS からUTF-8へ変換」してますか?
$_は「while (<IN>){」の<IN>で1行読み込まれ、「chomp ($_);」で末尾の改行コ...続きを読む


人気Q&Aランキング