Perlコーディング初心者質問スレ Part 38
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
04/10/07 23:23:08ID:kiEzDCJF【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0233231
04/10/20 17:09:17ID:???0236221
04/10/20 17:24:04ID:???申し訳ないですが、もう少し方法を具体的に教えていただけないでしょうか。
「EUCで取り出した」とはどの部分を指すのでしょうか。
$temp_euc =~ s/([\x8E\xA1-\xFE])/'%'.unpack("H2", $1)/eg;
のように、一括で変換を行なうわけではないということですか?
0237nobodyさん
04/10/20 17:28:45ID:???その例でいくと
unpack("H2",$1)
のところを
unpack("H2",eucをsjisに変換する関数($1))
にすればいいってことでしょ。
0241nobodyさん
04/10/20 22:16:04ID:???, -,:' / ̄) i{'r‐-、 `ヽ、
. _...,,o‐y ,:'- '⌒ ⌒ヽ. `ヽ' ,
(o( ,' / / 、 `ヾ. ヾ,
,:'´//7,' ,' .,' ,:' ! } i !', ':, ':, ゙:,
,' / ,' {l. ! {/ ,イ / }| !|', !. ', ', ゙,
ハ〃 ! !| | | ∠/ ,:'-ノ} /リ l ,ム. ! } |!
ハヽ、ゝ!| l | ,:',;='ィ'、'´ ,'.ノ ノ.,;lノ=、l .,' ,' ,' ノ
{ l l ', |'ヲi(_ノ.} ´ i(ノ.}゙!ノ,:',:''´
', h. ', ',゙、 ':゙゙_.ノ. ':゙_ノ〃ン
':, { ',', ':,':, 丶 ,' l .}
ヾ ':,':, ':ヾ、._ 「´/ ,' | .,' / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
`ヾ-、`ヽ_ `´ _,.ィリ.ノ ,' < なんとなかるよ、絶対大丈夫だよ!
リ';',ヾ| ` ‐┬ ´ _ノノ,'/ \______________
ヾ,、-- 、 _ | ´ノ'
f ヾ、..___ ヽ、 ー‐''
/_......_ \
0242nobodyさん
04/10/20 22:31:34ID:???0243nobodyさん
04/10/20 22:35:28ID:xGLMj0YBこのコードの意味がさっぱり分からんのでオシエテクリソ-
0244nobodyさん
04/10/20 22:56:55ID:???$abc, $def の2人が「俺の物だ」って奪うんだよ。
でも不思議なことに奪われた袋の中身はなくなっていなーい。
0245nobodyさん
04/10/20 23:02:27ID:???0246nobodyさん
04/10/20 23:14:24ID:xGLMj0YB@_は変数ではないですよね?
もう少しヒントクリソー
0247nobodyさん
04/10/20 23:26:27ID:???0248nobodyさん
04/10/21 01:10:59ID:???$str =~ s/([\x81-\x9f\xe0-\xfc])([\x40-\x7e\x80-\xfc])/sprintf("%%%02X%%%02X",ord($1),ord($2))/eg;
っと、半角カナ用にもう一押し必要か。残念!
\xa0-\xdf斬り。
0249nobodyさん
04/10/21 01:31:19ID:???ASCII文字って厳密にはどこまでを指してんだ?
半角英数字記号をASCIIってとらえるんなら、
0250nobodyさん
04/10/21 02:46:20ID:???0251201
04/10/21 05:43:48ID:???LAN側からのみルーターにプライベートアドレスでtelnetでアクセス
で情報を得る。
0252nobodyさん
04/10/21 10:50:09ID:???my ($abc, $def) = @_;
print ($abc, $def);
print \n;
print @_;
する
0253221
04/10/21 11:33:49ID:???$temp_euc = $temp; # $tempはsjisで、ファイル名だけが入ってます
&jcode::convert (\$temp_euc, "euc"); # $tempをEUCにした$temp_eucを用意
if ($temp_euc =~ /[\x8E\xA1-\xFE]/) { # Perlメモの正規表現より「ASCII以外」の文字列がある場合
$temp_euc =~ s/([\x8E\xA1-\xFE])/'%'.unpack("H2", &euc2sjis ($1))/eg; # ここを変更
}
print <<"HTML";
<A href="$absolute_dir\/$temp_euc">$temp</A> # 絶対パスとファイル名を結合したパスへとリンク
HTML
sub euc2sjis { # 追加したサブルーチン
my $str = $_[0];
&jcode::convert (\$str, "sjis", "euc");
return $str;
}
>unpack("H2",eucをsjisに変換する関数($1))
と言って下さったように変えてみたのですが、HTML部に表示されるエンコードされたURLは変わらずEUCのままでした。
追加したサブルーチンが動いていないのかとも思って確認しましたが、
単体で動かして確認したところ、sub euc2sjisは正常に動いているようです。
他の方が提示してくださった方法も見てみます。
0255nobodyさん
04/10/21 12:09:34ID:???なんか、そこはかと遠回りしている気がするよ。\Wをエンコードするだけじゃ動作しなかったっけ?別に正確なURLエンコードを目指さなくても動作すればそれでいいのでは?
0256nobodyさん
04/10/21 12:24:56ID:???諦めるのかw
0257nobodyさん
04/10/21 12:30:19ID:a34sr5QLa0001
a0002
a0003
という風に増加する変数を作りたいのですがどうすればいいでしょうか?
参考になるサイトなんかあったら教えてください。
宜しくお願いします
0259nobodyさん
04/10/21 12:39:13ID:???0260nobodyさん
04/10/21 12:55:04ID:???レスありがとうございます。素朴な疑問ですが、
アルファベット文字含んでても、++で問題なく a002 になるんでしょうか?
>>259
調べてみます。ありがとうgざいます。
0263nobodyさん
04/10/21 13:25:31ID:???0264221
04/10/21 14:44:50ID:???半角カナ以外では正常に実行できました。
とりあえずはこの方法で実装しようと思います。
あとは半角カナの対応ですか・・・
0265nobodyさん
04/10/21 15:11:42ID:???\x5Cを含む表や申が入っている漢字でも上手く行く?
気になったからやってみたけど
Win2k+Apache1.3.31+ActivePerl v5.6.1の環境で正常動作しないんだよな
0266221
04/10/21 15:25:17ID:???「Win2000Pro ActivePerl5.6.1 AN HTTP Daemon 1.42k」という環境で実行してます。
実際に導入するのは、悪名高い@ni○tyのCGI鯖ですが。
「―ソЫ\噂浬欺圭構蚕十申曾箪貼能表暴予禄.txt」
という、わざとらしく\x5Cを使った文字で構成されたファイル名を用意して、
このテキストファイル内の文字を検索して結果画面を出してみたところ、
<A href="%81%5C%83%5C%84%5C%87%5C%89%5C%8A%5C # 略 # .txt">―ソЫ\噂浬欺圭構 # 略 # .txt</A>
というHTMLが出力され、実際にそのリンクからファイルへアクセスできることは確認できました。
また、そのテキストファイル内に「―ソЫ\噂浬欺圭構蚕十申曾箪貼能表暴予禄」という内容を書き、
同じく「―ソЫ\噂浬欺圭構蚕十申曾箪貼能表暴予禄」で検索して正常に結果が表示されることから、
今のところは>>248氏の処理で半角カナを扱えない点以外での問題は無さそうです。
0267nobodyさん
04/10/21 15:43:18ID:???my @str = qw(
http://example.com/data/リンクの方法.txt
http://example.com/data/俺俺.txt
http://example.com/data/ハンカクカナA.txt
http://example.com/―ソЫ\噂浬欺圭構蚕十申曾箪貼能表暴予禄.txt
);
s{([\x00-\x7F\xA1-\xDF]|[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])}{
my $chr = $1;
$chr =~ /^[\x00-\x7F]\z/
? $chr
: join('', map sprintf('%%%X', ord), split //, $chr)
}eg for @str;
print join "\n", @str;
# SEE ALSO: http://homepage1.nifty.com/nomenclator/perl/shiftjis.htm
0268265
04/10/21 16:25:51ID:???エンコードは問題ないのにアクセスできないという不思議な現象に陥ってました
結局ANHTTPDに変更したらあっさり解決したのでApacheが悪かったようです
しかし何故Apacheじゃ見えなかったんだろう?
うーん気になるな・・・
0270nobodyさん
04/10/21 16:52:10ID:???for (@配列) { 〜 }
って、これって
foreach (@配列) { 〜 }
と繰り返す回数って違うの?
0271nobodyさん
04/10/21 16:57:06ID:???0272221
04/10/21 17:56:10ID:???が、肝心の s{ 以下の処理の部分が何をしているかが不明なので、ちょっとまだ導入できないです・・・
? と : が if else って事くらいしかわからない上に、色々と省略された書き方をされているようなので、
理解には時間がかかりそうです。
一文字ずつ分解して、[\x00-\x7F]以外のものはordで数値変換してsprintfで16進数に書き出しているということですよね。
splitを消すと\x5Cがおかしくなるようですが、何の処理をしているかもまだ理解の範疇にはないようです。
省略した書き方とかしたこと無いんで、冗長なコーディングしか出来ない自分が悲しい・・・
あと、省略できるものも極力省略しないという書き方をしているので(自分が理解できなくなると困るので)、
このソースをもとに何とか書き換えて実装してみようと思います。
0273nobodyさん
04/10/21 20:11:32ID:a34sr5QLサブルーチンとして起動させると、作業を終える前に次のコードに移ってしまいます。
これはどうやって防げばいいでしょうか?
0274nobodyさん
04/10/21 20:52:06ID:???そのサブルーチンの最後に何かフラグを立てて、
それが立ってなければ待つってのは?
0275nobodyさん
04/10/21 21:15:46ID:???サブルーチンという言葉の使い方が間違っているように思えてならない。
ひょっとして「子プロセス」とかそういうモノを指しているのか?
0276273
04/10/21 21:40:12ID:a34sr5QLいわゆる.plファイルです。
aというモジュールがあります。
b(.pl)というモジュールからaをuseしてます。
.cgi からbモジュールをrequireすると、aモジュールの作業を完了しないまま、
bモジュールの次のコードに移ってしまいます。
.cgiにから直接aモジュールをuseしたら、問題は
発生しませんでした。
0277nobodyさん
04/10/21 22:08:58ID:???0278nobodyさん
04/10/21 22:14:52ID:???ああわかった。それはあれだ。
use したファイルはコンパイル時に読み込まれて実行されるが、
require したファイルはコード実行時に読み込まれて実行される。
b が require された時点ではコンパイルがとっくに終っているので
b の中で use した a が実行される機会は永遠に巡ってこない。
0280278
04/10/21 22:31:20ID:???0281273
04/10/21 22:51:54ID:???require、use云々ではないかもしれません。
wait;ってのが気になってるのですが、
これはどうやって使えばいいのでしょうか?
ググッテも情報量がひっじょーに少ないとです。
ヒロシです
0282nobodyさん
04/10/21 23:06:49ID:???wait は子プロセスの終了を待つ関数なので、使えない
0283nobodyさん
04/10/22 10:48:37ID:???if (nyuryoku == '\0') {exit(0);}
て書けるけど、perlだとどう書きますか。以下の何入れても
quer!が出ちゃうんです。
$var=<STDIN>;
chomp($var);
if ($var eq "\0") {
exit(0);
} else {
print "quer!\n";
}
0284nobodyさん
04/10/22 10:50:06ID:cSoqDRBP0287nobodyさん
04/10/22 11:42:34ID:Y4MW0wLE自分で実装するしかないのでしょうか?
0288nobodyさん
04/10/22 11:55:42ID:+fQGbTx6"E6%8E%B2%E7%A4%BA%E6%9D%BF"
となると思います。
そして本来UTF-8のコードである "E6%8E%B2%E7%A4%BA%E6%9D%BF" を誤って
$str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C",hex($1))/ge;
でデコードすると
"牙ず? "
となってしまいます。
この "牙ず? " を元のUTF-8のコード "E6%8E%B2%E7%A4%BA%E6%9D%BF" に戻すには
どのように処理したらいいのでしょうか?
どなたか教えて下さい。
0289nobodyさん
04/10/22 12:20:13ID:???バイト列としてはちゃんとデコードできているが、utf8として解釈すべき
バイト列をEUCだと思って見てるから変に見えるだけじゃない?
EUCで表示したければ適当にutf8→eucに変換すればいい。
use Jcode;
$str = "%E6%8E%B2%E7%A4%BA%E6%9D%BF";
$str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C",hex($1))/ge;
print Jcode->new($str)->euc,"\n";
0290nobodyさん
04/10/22 12:45:55ID:pO/k5T0Y手持ちのマニュアルで16進定数の記述方法が
$a='/abcd';
となっていたので携帯用絵文字を定義しようとしたのですが、
print $a;
をやると、/abcdと出てしまいます。
' を " に変えたり色々してみたのですが上手くできません。
正しい16進定数の代入の仕方を教えて下さい。m(__)m
0291nobodyさん
04/10/22 13:17:36ID:???0292nobodyさん
04/10/22 13:17:37ID:???0293nobodyさん
04/10/22 13:33:16ID:???0294nobodyさん
04/10/22 14:27:39ID:pO/k5T0Yありがとうございます。
今からやってみます。(;;
0295nobodyさん
04/10/22 15:33:52ID:pO/k5T0Yありがとうございました!!!!!
0296nobodyさん
04/10/22 17:38:09ID:gkwMnLH6よろしくお願いします。
環境:FreeBSD 4.7 UNIX O/S
perl5.6.1
0297296
04/10/22 17:45:28ID:gkwMnLH6下手くそな文章で申し訳ありませんが、よろしくお願いします。
0298nobodyさん
04/10/22 17:54:42ID:???0300nobodyさん
04/10/22 18:02:41ID:???http://perldoc.com/perl5.8.4/pod/func/system.html
http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&lc=1&cmd=&man=tar&dir=jpman-4.7.0%2Fman§=1
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq8.html#How_can_I_capture_STDERR_from_an
0301300
04/10/22 18:07:22ID:???http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&lc=1&cmd=&man=tar&dir=jpman-4.7.0%2Fman&sect=1
0303nobodyさん
04/10/22 19:26:58ID:???としたら、
apacheのエラーログにUnrecognized characterというエラーが表示されました。
どうも、テストという日本語に問題があるようですが、
この場合、どうすれば日本語を利用できるようになるでしょうか?
phpを以前ちょっといじっていて、htmlの組み込み安さに感動したんですが、
perlは結構面倒なんですかね?
0304nobodyさん
04/10/22 19:31:59ID:kB/Ig1ML0305nobodyさん
04/10/22 19:32:44ID:PwMLf+Ap$data=new CGI;
$name=$data->param('name');
$mail=$mail->param('mail');
$message=$message->param('message');
こうやって取り出したデータの中の文字は、
URLエンコードされたままではなく元に戻されているのでしょうか?
0307305
04/10/22 19:50:08ID:PwMLf+Apプリントしてみたら元に戻っていたので、あれ?と思ったんです。
今までずっと$name=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
やってたんですけど。
実は要らなかったのかなと思いまして。
実際どうなんでしょう?
ついでに、文字コードなんかはどうなっているのでしょうか?
0308nobodyさん
04/10/22 19:58:14ID:???0311nobodyさん
04/10/22 20:05:07ID:???漏れは敢えて「やってみなきゃわからんのは頭悪過ぎ。まず man を読め」と言うことにする
0313nobodyさん
04/10/22 20:56:34ID:???0315303
04/10/22 21:00:19ID:???だれかヘルプみー
0318nobodyさん
04/10/23 15:43:12ID:EsL8XLQNperlには、Cにおけるfprintfのような関数はないのでしょうか?
print FILE hogehoge;
というのが何行も続いてしまい、違和感を感じるのですが。
0319nobodyさん
04/10/23 16:40:33ID:???Perlは元々レポート作成用言語ディスよ?
fprintfに限らず、テキストの、文字入出力、ファイル入出力においての利便性は
Cとは比較にならんて。
ヒアドキュメントでも、format でも sprintf でも好きなもので対処すれば?
0320nobodyさん
04/10/23 16:41:54ID:???の「||」の意味が分かりません。
だれか教えてくださいませ
0321nobodyさん
04/10/23 16:43:05ID:???or と ほぼ同じ。 or よりも優先順位が高いので or と書いておいたほうが
意図どおり動くことが多いはずだよ。
0325nobodyさん
04/10/23 17:42:48ID:???sprintfで解決しました。
printする文字列を関数呼び出しで作成するというのは考えが及びませんでした。
どうもありがとうございました。
0326nobodyさん
04/10/23 19:41:00ID:???perlで利用することは不可能でしょうか?
権限ないディレクトリにはディレクトリ作成できなかったので、
sudoで特定のユーザにmkdirの権限与えたのはいいものの、
perlで使おうとしても使えないんですね。
telnet経由しかむりぽなのでしょうか?
0327nobodyさん
04/10/23 19:55:17ID:???コーディング 【coding】
プログラミング言語を使ってソフトウェアの設計図にあたるソースコードを作成すること。
(e-Wordsより)
自分の質問がPerlに関することなのか、
それともPerlではなくCGIやHTMLについてなのかを切り分けした上で、
質問して下さい。
0328nobodyさん
04/10/23 19:55:48ID:???いや、普通にできると思うけど。具体的にどうやってるか示されてない
のでこれ以上はなんともいえんがな。
でもmkdirのような引数しだいでどこにでもディレクトリ作れるコマンドを
sudoで許可するのはあまり感心しないな。
0329326
04/10/23 20:20:45ID:???としています。
aユーザからbユーザのディレクトリに newというディレクトリ
を作成するようにしていますが、
上記ではうまくいきません。
bユーザディレクトリの権限をaユーザのものにし、
my $makedir = `mkdir $user_dir/new`;
とした場合は問題なく作成されます。
宜しくお願いします
0330nobodyさん
04/10/23 22:28:08ID:???0331nobodyさん
04/10/23 23:18:04ID:???次の質問よろ
0332nobodyさん
04/10/24 10:16:22ID:???何か意味があるんですか?
■ このスレッドは過去ログ倉庫に格納されています