• ベストアンサー

substrとBASICのMID

perlで substr関数を使って驚いたのですが、 my $a = "abcdefg"; my $b = substr($a, 0, 1, ''); print $a, "\n"; print $b . "\n"; で、$bがaだとは分かるのですが、$aが bcdefg と無くなっています。正しいと思いますが、 私自身文字列の取り出しでてっきり abcdefgのままだと思っていたので驚きでした。 BASICでいう MID関数と同じような働きのPerl関数は あるのでしょうか?モジュールでも結構です。

  • Perl
  • 回答数2
  • ありがとう数0

質問者が選んだベストアンサー

  • ベストアンサー
  • SE-1
  • ベストアンサー率57% (26/45)
回答No.1

my $a = "abcdefg"; my $b = substr($a, 0, 1); print "$a\n"; print "$b\n"; これだと $a は abcdefg のままでした。回答になったかわかりませんが・・

その他の回答 (1)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

perldoc -f substr してみて下さい。 4つめの引数が指定された場合は、それで、該当部分が置き換えられます。 置き換えをしない場合は、#1で指摘されているように、4つめの引数は指定しません。

関連するQ&A

  • javaで substrと置換処理

    perlで以下の処理をJavaに置き換えたいのですが、javaがよくわかっていません。 my $moto = "abcdefg"; my $pos = 2; my $size = 1; my $rep = "Z"; $ret = substr($moto, $pos, $size, $rep); # $ret = "c"; # $moto = "abZdefg"; となりますが、javaではどのように書くのでしょうか? javaにがsubstringはあるみたいですが、substrがないみたいです。 しかも、perlでの第4引数は置換までできます。

    • ベストアンサー
    • Java
  • substrの文字列の境界の動作について

    perl5.8を使っています。substrの動作について、以下の動作はperlの仕様どおりでしょうか? 以前、どこかのソースで#--1や #--2の場合はundefとなる?のを見た記憶があるのですが、文字列の境界の動作について理解していないのでよろしくお願いいたします。 $|=1; use strict; use Data::Dumper; my $str = "0123456789A"; print Dumper( substr($str, 10, 1) ); # $VAR1 = 'A'; print Dumper( substr($str, 11) ); # $VAR1 = ''; # --1 print Dumper( substr($str, 12) ); # substr outside of string at test.pl line ...  # --2 exit;

    • ベストアンサー
    • Perl
  • perlの型と8進数、10進数

    ある文字列からsubstrで3桁の数値を切り取り、計算に使いたいのですがゼロ詰めの数値の場合8進数になると思っていたのですが、文字列の場合は10進数の数値になります。 これは仕様でしょうか? perlは型がないので、AもBもCも同じ値だと思っていましたが、 そのあたりについて詳しい方、違いを知っている方教えて頂けますか? #-- A -- my $s = "007008009010"; print int( substr($s, 0, 3) ) . "\n"; print int( substr($s, 3, 3) ) . "\n"; print int( substr($s, 6, 3) ) . "\n"; print int( substr($s, 9, 3) ) . "\n"; print; #-- B -- print int("007") . "\n"; print int("008") . "\n"; print int("009") . "\n"; print int("010") . "\n"; print; #-- C -- print int(007) . "\n"; # 7 #print int(008) . "\n"; #print int(009) . "\n"; print int(010) . "\n"; # 8

    • ベストアンサー
    • Perl
  • 正規表現の書き方に困っております。

    あるSQLのダンプを変換するプログラムをPerlで書いているのですが、 うまく正規表現が書けなくて困っております。 データの途中に,が有ると、うまくいきません。 ''の中に囲まれた,は無視するという正規表現を書きたいのです。 また、'''B'も正しく処理できれば、完璧です。 #!/usr/bin/perl use strict; use warnings; #my $a = qq{'A','B',1}; --> うまくいく  ['A']['B'][1] #my $a = qq{'A,','B',1}; --> うまくいかない ['A] ['] ['] my $a = qq{',','''B',1}; --> もっとうまくいかない ['][']['] if($a =~ /(.+?),(.+?),(.+?)/){ print "[$1]\n"; print "[$2]\n"; print "[$3]\n"; }else{ print "ERR!\n"; } exit; __END__

    • ベストアンサー
    • Perl
  • n88basicでは動いたのに十進ベーシックではだめでした。どうしてですか?

    10 INPUT a,b 20 IF a<b THEN beep 1,FOR n=1 TO 100000,NEXT n,beep 0 22 IF a<b THEN swap a,b 30 PRINT a/b END n88basicではこのままで動いたのに十進ベーシックでは「ここにNは書けません」とメッセージが出ました(20行)。どうしたらいいですか。

  • 配列のコピー及び printの .と,の挙動の違い

    以下、Perlの仕様についてわからないことが2点あります。 1) 配列のコピーは実態をコピーするようですが、参照扱いになるのは引数で与えた時でしょうか? 2) 下の例で@aは 6という個数を返し、@bは 1bcという配列の中身を返します。printの.と,で挙動が変わる理由が知りたいです。 例) my @a = qw(1 2 3 a b c); my @b = @a; splice @b, 1, 3; print @a . "\n"; # 6 print @b , "\n"; # 1bc

    • ベストアンサー
    • Perl
  • 今日最後の質問!MID関数について・・・

    今日はいっぱい質問させ頂きましたが あともう一度MID関数について教えて頂きたいです MID関数で引っ張ってきた数字を まったく違う文字を表示させる方法は有るでしょうか?(32個種類があります) たとえばですが MID関数で引っ張って来た文字をこの時はこの文字と言う形です 1の時は A1 2の時はA2 3の時はB6 と言う風にです これさえ分かれば仕事がはかどるのですが・・・・ 宜しくお願い致します あと関数に対する勉強方法・良い本 などがありましたら教えてください 宜しくお願い致しますm( __)m

  • Perlで足し算をするには

    Perl 初心者です。 いい足し算ができず、困っています。my $Aの数字を足していくだけなのですが、 うまくいきません。 何が悪いのかわかる方教えてください。 よろしくお願いいたします。 Perlではsumをつかわないでしょうか? 下記は4と2と3なので、9になるはずなのですが。。。。 その1 my $A = 4,2,3; $B = (sum($A)); print "$B" その2 my $A = 4,2,3; $B = subsum($A); print "$B"

  • join と split で文字列を操作する場合

    にんにちは、 うまく解決する方法を思いつかないので、質問させてください。 以下のスクリプトを実行すると、a から z を * で join して、 その後、* で split するかなと思ったら、split は正規表現として とらえるためでしょうか、エラーになります。 #! /usr/bin/perl -w use strict; my $a = '*'; my $b = join $a , ('a'..'z'); print "$b\n"; my @result = split /$a/,$b; print "$_\n" foreach @result; exit(); $a = '\*'; にすると、split したときに、 余計な \ が残ってしまいます。 任意の(書く時点では分からない)いろんな文字列で 連結したり分割したりする場合のスマートな方法が ありましたら、教えていただけませんか? Perl 5.8 です。お願いします。

    • ベストアンサー
    • Perl
  • excel→txtファイル作成時、セル間にできることがある「”」を指すメタ文字

    Perlで書いたプログラムでデータファイルを用いるため、Excel→txt形式(タブ区切り)でファイルを保存し、perlでそのテキストファイルのデータをprintしてみると、セルとセルの間に「”」というような記号が入ってしまうことがあります。 これをsplitで省くことはできますでしょうか?その際に用いるメタ記号も教えていただけないでしょうか?各要素を取り出すためにいい方法があれば教えてください。 (1)元のExcelファイル id 2000 2001 2003 001 A_IN A_IN B_IN 002 B_IN B_IN OUT (2)テキストファイル(タブ区切りで保存) id 2000 2001 2003 001 A_IN A_IN B_IN 002 B_IN B_IN OUT (3)以下のようなperlプログラムでprint表示させると「"」という記号が入ってしまい、要素ごと(例えばA_IN、OUT)にデータ処理を行うことができません。 「プログラム」 #import txt file my $errmsg = "can not open $data\n"; my @data0; open(FID, $data) or die $errmsg; chomp(@data0 = <FID>); close FID; my $number = @data0; for (my $i=1; $i<$number; $i++) { my @a = split(/\r/, $data0$i]); my @b = split(/\t/, $a[0]); print @b, "\n"; ←このprintの結果が以下のようになります。 print $b[0], "\n"; ←そのため、タブによるsplitがうまく print $b[1], "\n";  出来ておらず、これらの値も変 print $b[2], "\n";  なものが出力されてしまいます・・・。 print $b[3], "\n"; } 「結果」 001A_IN"A_IN"B_IN 002B_IN"B_IN"OUT (「”」が入る位置は何回か試したところ、変わることがありました。)

専門家に質問してみよう