Perl コーディング初心者質問コーナー Part34
■ このスレッドは過去ログ倉庫に格納されています
0001前スレの連投で気分崩したので後よろ
04/04/05 16:01ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこう言う事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0133nobodyさん
04/04/11 00:36ID:???package内ではourをつけて宣言するんだ
(mainの中でmyをつけて宣言するのと同じように・・・ってmyの複数形なんだな)。
package内で$varとしたらグローバルになっちゃうわけですね。
0134nobodyさん
04/04/11 01:34ID:???全然違うし。
http://www.kt.rim.or.jp/%7ekbk/perl5.005/perlmod.html
my 変数はシンボルテーブルで管理されていないので、同じファイル上で
宣言されていれば名前空間が変わっても参照できる。strict プラグマの
影響範囲も同様。
#!/usr/bin/perl
use strict;
package Foo;
my $foo = 'foo!'; # strict vars の影響範囲内
package Bar;
print $foo; # foo!
__END__
vars プラグマや our によって宣言された変数は strict のチェック
対象外となるだけでグローバル変数と同等。シンボルテーブルで管理
されているから $Config::host のようにパッケージ名から指定すれば
外部から参照できる。
あと標準モジュールに Config.pm があるので、パッケージ名に
Config を使うのは止めた方がいい。
0135nobodyさん
04/04/11 04:40ID:???use strict;
use warnings;
use sigtrap;
use diagnostics;
&main;
exit;
sub main {
my $val1 = 1; our $val2 = 2;
&test;
print '$val1(' . \$val1 . qq|="$val1"\n|;
print '$val2(' . \$val2 . qq|="$val2"\n|;
# print '$val3(' . \$val3 . qq|="$val3"\n|;
# print '$val4(' . \$val4 . qq|="$val4"\n|;
sub test {
my $val3 = 3; our $val4 = 4; $val1 = 5; $val2 = 6;
print '$val1(' . \$val1 . qq|="$val1"\n|;
print '$val2(' . \$val2 . qq|="$val2"\n|;
print '$val3(' . \$val3 . qq|="$val3"\n|;
print '$val4(' . \$val4 . qq|="$val4"\n|;
}
}
0136nobodyさん
04/04/11 08:05ID:???まー大体予想通り。
>sjisだと色々問題が発生するのでソースはeucが基本、と書いてあるHPを読んだのでeucにしておりました。
最近の Perl では
>Perl5.8だと内部ではUTF8でどうのこうの
の通りコード変換を行うのでとりあえず大丈夫。
ポイントは use encoding の役割。
・ソースコードの文字コード指定(Perl がソースを解釈する際、この文字コードから UTF-8 に変換)
・標準入出力の文字コード指定(STDIN, STDOUT に対する入出力をこの文字コードに変換)
の 2 つ。つまり、>>112 のコードでは
ソースコードでは euc → Perl 解釈時に UTF-8 に変換(よってis_utf8($x)が真) →
print で(STDOUT)に出力される時点で再び euc に変換
という流れ。詳しくは perldoc encoding 参照。
0137nobodyさん
04/04/11 08:29ID:???パッケージだとかモジュールだとかについて詳しく知りたければ、「続・初めてのPerl」を
読むといいかもしれない。
正直この本に「続・初めてのPerl」とタイトルをつけるのは間違ってるという気もするけどね。
表表紙も「Perl オブジェクト、リファレンス、モジュール」っていう副題の方が文字でかいし。
>>134
細かいことだけど、正確には同じファイル上で、じゃなくて同じブロック(の前方)で、だよね。
0138nobodyさん
04/04/11 10:29ID:???ファイルスコープはブロックじゃないので、より正確には
<q>
my と local は、変数 (my の場合) やグローバル変数の値 (local の場合)
を、それをとり囲むブロック、サブルーチン、eval 、またはファイルの中が
有効範囲となるように宣言する。<cite>駱駝本 2nd Edition 2.6.8</cite>
</q>
だね。
0139nobodyさん
04/04/11 12:37ID:e6FKOv37foreach(keys(%a)) { $i++ } のように一個一個数えていくしかないのでしょうか?
0140nobodyさん
04/04/11 12:41ID:???0141nobodyさん
04/04/11 13:10ID:e6FKOv370142nobodyさん
04/04/11 13:53ID:e6FKOv37クラスでインスタンス毎に別個の値を保存したい連想配列があるのですが
どういう風に実装すればいいのかわかりません。
以下のようなコードだと複数のインスタンスから%aにアクセスされると
まずいことになっちゃいますよね?
my %a;
sub new {
my $self = shift;
my $obj = {
name => shift
};
bless $obj,$self;
$obj;
}
0143nobodyさん
04/04/11 14:24ID:???sub new {
my $self = shift;
my $obj = {
name => shift
};
bless $obj,$self;
$self->{HOGEHOGE} = {};
$obj;
}
0144nobodyさん
04/04/11 15:12ID:U2PVfz4j$addr = (gethostbyname("hogehoge.com"))[4];
$name = pack("S n a4 x8", 2, 80, $addr);
socket(S, 2, 1, 0);
connect(S, $name);
binmode(S);
select(S); $| = 1; select(stdout);
print S "GET /index.html HTTP/1.0\r\n\r\n";
while (<S>) { print; }
close(S);
なんて事をやったんだが、http://hogehoge.com/index.htmlのソースが表示されるワケではなく、
HTTPヘッダが表示された。
ヘッダは良いからindex.htmlのソースを読みたいんだけど、どうやればいいのかGoogle検索してもわからん
どうやるんすか?
0145144
04/04/11 15:26ID:U2PVfz4j自分ではまだ作れないからとりあえず他人作の関数使うわ
理解は後回し
0146nobodyさん
04/04/11 15:26ID:???でなければLWP使え。
0147nobodyさん
04/04/11 15:34ID:e6FKOv37ありがとうございます
0148nobodyさん
04/04/11 17:59ID:9ah7xv1/<> ; # ! <STDIN>;
open File,"$ARGV" or print $!,"\n";
# Not ($ARGV[0] and @ARGV);
while(<File>){print;}
close File;
なぜに動くのか ???
デバックするとよけーに分からん
猿でも分かる説明 お願いします
0149nobodyさん
04/04/11 18:32ID:???<>は<ARGV>と同じ。
ファイルハンドルARGVは*最初に<>/<ARGV>を評価した時に*@ARGVの、
中身をファイル名のリストと見なし、$ARGV[0] .. $ARGV[n]を順に暗黙のうちにopenする。
中身がなければSTDINと同じ。
そして、この暗黙のopenの時$ARGVに開くファイルの名前を入れる。
ここまで分かれば>>148の動作も理解できるだろ?
つーかどのような経緯で>>148のようなコードを書くことになったのか非常に興味がある。
普通のスクリプトでそんなコードがあったら素で作者の正気を疑うぞ。
0151ちょー素人
04/04/11 19:23ID:UpvZGEBTこの使い分けの意味がよく分かりません。
サーバーによって使える言語が違うということでしょうか?
0152148
04/04/11 19:25ID:???明確な違いを知りたかったので
自分で書いてみますた
もっと分かりやすい
スクリプトあれば教えてくだされ
0155nobodyさん
04/04/11 20:53ID:???今から勉強するとしたら何を学んだほうがいいのでしょうか?
ちなみに会社ではパルとPHPがメインみたいです。
0157nobodyさん
04/04/11 21:07ID:???マジレスすると、「なにをやりたいか」による。
会社でPerlとPHPがメインなら、そっちに磨きをかけた方がいいかもしれない。
会社がその後、ASP.NETなんかに転ぶ可能性があるなら、今のうちに勉強しておくのもいいかもしれない。
それよりもそろそろPerlのコーディングの質問はこないものか。
0158nobodyさん
04/04/11 21:15ID:???>>152もこれ見て分からなきゃ「初めてのPerl」を百回読め
# 初めて<ARGV>とされた時に呼ばれる関数
sub __initialize_argv__{
unless(defined fileno ARGV){
@ARGV = ('&STDIN') unless @ARGV;
$__internal_index__ = 0;
$ARGV = $ARGV[$__internal_index__++];
open ARGV, $ARGV
or die "Can't open $ARGV: $!";
}
}
# <>;
__initialize_argv__();
<ARGV>;
あとはARGVがEOFに達すると自動的に$ARGV[$__internal__index++]をopenするというわけだ。
0163nobodyさん
04/04/11 23:31ID:???if (!-e image/$new){
mkdir("image/$new",0777);
chmod(0777, "image/$new");
}
0164nobodyさん
04/04/11 23:34ID:???0165163
04/04/11 23:42ID:???理由は
if (!-e image/$new){
が
if (!-e "image/$new"){
にするのわすれてました・・・。゚(゚´Д`゚)゚。
0166nobodyさん
04/04/12 02:29ID:???if (mkdir("image/$new", 0777)) {
chmod(0777, "image/$new");
}
elsif (!-d "image/$new") {
die;
}
0168nobodyさん
04/04/12 03:42ID:???0169nobodyさん
04/04/12 04:10ID:???0170nobodyさん
04/04/12 06:57ID:???umask効いてる時は、mkdirのパーミッション指定が効かなかった記憶がある。
0172nobodyさん
04/04/12 10:13ID:???0173nobodyさん
04/04/12 11:40ID:???0174nobodyさん
04/04/12 18:49ID:DgDkioXO(例)japan/korea どのような構文を使えばいいのでしょうか?
0175nobodyさん
04/04/12 18:50ID:???0176nobodyさん
04/04/12 18:54ID:???0177nobodyさん
04/04/12 18:57ID:???0178nobodyさん
04/04/12 19:02ID:???0179nobodyさん
04/04/12 19:38ID:???0180nobodyさん
04/04/12 19:42ID:???0181nobodyさん
04/04/12 19:57ID:???($hoge,$foo) = split /\//, 'japan/korea';
こんな感じですんでまた来てね♥
0182nobodyさん
04/04/12 20:12ID:???0183nobodyさん
04/04/12 22:06ID:???# 侮ヲ不可狽ネ頼エ
これってもちろんPerlのバグですよね?
0187nobodyさん
04/04/12 22:51ID:???PERLで「cgiを呼び出すHTML」を吐き出すcgi を作ったのですが
クエリーがうまくわたらないのです。
1.最初の(固定の)HTMLでは、ファイル中のクリッカブルマップからたとえば
test1.cgi?hogehoge
をリンクしています。
2.test1.cgiでは QUERY_STRING から hogehoge を取り出し
データファイルと照合して hogehogehoge というアイテム名を取り出してるので
HTMLファイルに、
<A href="test2.cgi?hogehogehoge> と出力させています。
3.test2.cgi では、 QUERY_STRING から hogehogehoge を取り出すようにしているのですが
ここで 空文字列しか来ていないようで、2.のHTMLファイルのリンクをクリックするとエラーです。
test2.cgi は確かに呼び出しています。
一連の動作でやるとエラーなのですが、2.のHTMLが表示された段階でブラウザにソースを吐かせ、
それを別のHTMLファイルとして起動してやると、そこからのリンクでは、test2.cgi にちゃんと
hogehogehoge が渡っています。
何か設定を忘れているでしょうか?
0188nobodyさん
04/04/12 23:11ID:???↓
<A href="test2.cgi?hogehogehoge">
0189nobodyさん
04/04/13 00:51ID:???Redhat8.0のperl5.8.0でLWP使って
レスポンスヘッダを編集したいんですが、
newの書式が分からないです。マジで。
require HTTP::Response;
$rc = '200';
$msg = 'OK';
$header = 'Accept-Ranges: bytes\n';
$header .= 'Content-Length: 186965910\n'
$header .= 'Content-Type: text/html\n\n';
$content = '';
$res = HTTP::Response->new($rc, $msg, $header, $content);
print "$res";
と書いたんですが、InternalServerErrorで進めません。
HTTP::Responseでレスポンスヘッダを編集する方法教えてください。
お願いします。
0190nobodyさん
04/04/13 01:00ID:???なんかグタグタですな。。。
use HTTP::Response;
$header =<<"EOS";
Accept-Ranges: bytes
Content-Length: 186965910
Content-Type: text/html
EOS
186 MB の HTML なんてブラクラですね。。。
0191189
04/04/13 01:04ID:???お早い回答ありがとうございます。
いや、ヘッダー情報をいじったり削除したかっただけなんで、
値はどうでも良いかと思ってテキトーに設定しました。気をつけます。
0192nobodyさん
04/04/13 07:51ID:???Windowzで「ヌルポ」と文字化けします。
これってもちろんPerlのバグですよね?
0193nobodyさん
04/04/13 08:21ID:OVsnEkWRTEXTAREAの内容について改行の処理をしようとすると
数字の羅列になってしまいます。
$msg = $FORM{'msg'}; #バッファからセット。URLデコード済。
# $msg = ~ s/\r\n/<BR>/g;
この状態だと「$msg」の中身はちゃんと文字列になっているのですが
下のコメントをはずすと途端に数字の羅列になります。
(文字列を変えても同じ数字になります。)
どうすればこの状態を回避できるでしょうか?
0194nobodyさん
04/04/13 08:29ID:???$msg =~ s/\r\n|\r|\n/<BR>/g;
このようにコーディングしてみたらいけました。
0196nobodyさん
04/04/13 15:08ID:???何かちゃんとした名前があったような気がしたんだけど。
何だっけ。
カタカナ4文字でスがついたような気がする。
0197196
04/04/13 15:09ID:???名前がなかったかも。
0198nobodyさん
04/04/13 15:42ID:sCIWFJ4B表示させる、ということをやっています。
番号が入っているcar_numフィールド(11番目)には
[****-****-****-****]
という形でデータが入っています。
しかし、番号確認画面でその末尾4ケタのみ表示させたいのですが、
なかなか良い考えが浮かびません。
今は以下のように書いて丸々16ケタ表示させています。
諸先輩方、アドバイスよろしくお願いいたします。
<tr>
END
if ($odr[10] == 2){
print"$odr[11]"
}
print <<END;
</td>
0200199
04/04/13 16:05ID:???エボック秒だわ
0202199
04/04/13 16:06ID:???0205nobodyさん
04/04/13 18:00ID:???抜き出してPERLで使いたいのですが、どうすれば良いのでしょうか?
例えば
$string = "FilesystemSizeUsedAvailCapacityMounted on"
の一行から、Size, Usedだけを取り出して使いたいとすると、
@pairs = split(/(\t)/, $string);
print "@pairs[1] @pairs[2]";
としても上手く行きません。(\s)*でも無理なようです。
0206nobodyさん
04/04/13 18:18ID:???print "$pairs[1] $pairs[2]";
0207205
04/04/13 18:21ID:???@pairs = split(/\t/, $string);
だと、何故か全て@pairs[0]に全文が入ってしまい、
@pairs[1]以降は空になってしまうようです。
0209205
04/04/13 18:40ID:???shellのdfコマンド出力から一行抜いてきたstringです。
dfは何を使って区切っているのでしょう?
Filesystem 512-blocks Used Avail Capacity Mounted on
/dev/disk1s9 39870600 36823240 3047360 92% /Volumes/disk1
/dev/disk3s2 320144448 267850648 52293800 84% /Volumes/disk2
0210nobodyさん
04/04/13 18:42ID:???何も調べずに的外れなコードを書く奴もDQNだが、解答する奴もそれに劣らずイカレてるな。
>>205
> データから一部の数字だけ
とあるのにコードに数字が一切ないのは何故だ?
my(@data) = ($string =~ /([A-Z][a-z]+)/g);
print "$data[1], $data[2]\n";
お前の望むことはとりあえずこれで出来るが、本当にこんなことがしたいのか?
0211nobodyさん
04/04/13 18:44ID:???$stringを切って配列に代入しようとしてるなら
$stringをprintしてみれば何区切りかわかることだろ。
0213210
04/04/13 18:50ID:???おいおい…(絶句)
もう何も言うまい。ほらよ。
my %data;
my @fileds = ('Filesystem', '512-blocks', 'Used', 'Avail', 'Capacity', 'Mounted on');
@data{@fields} = split / /, $string;
use Data::Dumper;
print Dumper(\%data);
0215205
04/04/13 19:00ID:???みたいな感じの文章出力に使う用です。
0217nobodyさん
04/04/13 19:08ID:???0218nobodyさん
04/04/13 19:36ID:???WinXP+cygwin使用
$ df -h /cygdrive/c | perl -MData::Dumper -ne 'print Dumper split /\s+/'
$VAR1 = 'Filesystem';
$VAR2 = 'Size';
$VAR3 = 'Used';
$VAR4 = 'Avail';
$VAR5 = 'Use%';
$VAR6 = 'Mounted';
$VAR7 = 'on';
$VAR1 = 'c:';
$VAR2 = '74G';
$VAR3 = '39G';
$VAR4 = '35G';
$VAR5 = '52%';
$VAR6 = '/cygdrive/c';
0219205
04/04/13 19:40ID:???で出来ました。ありがとうございます。
0220nobodyさん
04/04/13 23:40ID:???187で質問した者です。
WEB動作環境は勤め先にあるので返答が遅れました。(アクセス制限がかかってるので)
ここに書いた例が間違っていて、実物はちゃんとダブルクォート閉じてました。
いろいろやってみて、どうも
A. CGIが出力したHTMをそのまま(連続で)表示した場合と、
B. それをソース表示して「保存」し、改めて表示した場合で
振る舞いが違うようです。こんなことがあるのかいなと思うのですが...
A.B.のHTMでは、hrefを使って別のCGIを引数つきで呼んでます。
そのCGIを、サーバにあった ENV.PL(環境変数を表示するやつらしい)と換えてみると
Bで表示される環境変数の多くがAでは出てこず、QUERY_STRINGもありませんでした。
(空文字列でなく、環境変数そのものが出て来ない)
ひょっとするとPERLの問題ではないかもしれませんが、スレ違いなら誘導してください。
明日はサーバーを変更してやってみます。
0221nobodyさん
04/04/14 00:50ID:???x <A href="test2.cgi?hogehogehoge">
o <A href="http://〜/cgi-bin/test2.cgi?hogehogehoge">
0223nobodyさん
04/04/14 06:12ID:???回答ありがとうございます。
最初の例では詳しく書いていませんでしたが、どちらのCGIの参照も
http:// から記述してます。(厳密には場所は一段違うところ)
222もそういう主旨ですよね?
0224nobodyさん
04/04/14 15:57ID:???CGI: Common Gateway Interface part 11
http://pc5.2ch.net/test/read.cgi/php/1055597189/
0225nobodyさん
04/04/14 19:03ID:ALtQW+6b187,220,223です。
誘導ありがとうございました。実は、サーバー変更(自分のPCでAN HTTPD走らせて)したら
問題なく環境変数が渡りました。問題のあったサーバーはNT+IISです。
どうもCGI機能まわりのようなので、あちらで聞いてみます。お騒がせしました。
0226nobodyさん
04/04/14 20:57ID:1L/HDnzJこちらへ質問させて頂きます。
a.pl
b.pl
というスクリプトで、a.plからb.plへ標準出力で引数を渡し
b.plで受け取った引数を加工して、同じく標準出力で
a.plへ返すには、どうすれば良いのでしょうか?
open(FD,"./b.pl data1 data2 |");
という感じでやってみたのですが、a.pl⇒b.plへ
うまく渡されません。
どなたか、ご教授お願い致します。
0227nobodyさん
04/04/14 21:06ID:???0228226
04/04/14 21:38ID:1L/HDnzJ0229nobodyさん
04/04/15 14:38ID:???@<<< @<<<<<< @<<<<<< @<<
$a $b $c $d
.
write;
で出力される物を掲示板などのhtmlに出力したいのですがどうすればいいでしょか?
print format DATA;
みたいなアホな事してみましたがやはりエラーです。
ぐぐっても該当しそうな記事がみつからないし図書館のperlクックブックは
貸し出し中・・
先輩方よろしければお助けください。
0230nobodyさん
04/04/15 15:06ID:???0231229
04/04/15 15:19ID:???0232nobodyさん
04/04/15 17:41ID:???format =
@<<< @<<<<<< @<<<<<< @<<
$a $b $c $d
.
write;
formatは半角スペースでレイアウトするからhtmlへ出力するなら
<pre>で囲んで使うとかしないと。
固定ピッチになって間が抜けて見えるから掲示板には向かない気がするが。
■ このスレッドは過去ログ倉庫に格納されています